Avatar
Gramli
Redaktor
Avatar
Gramli:

Zdravím,
snažím se napsat Space invaders a zasekl jsem se na jedné věci. Lodˇ se pohybuje i střílí, ale když například držím levou šipku a při tom zmáčknu mezerník, loď se přestane pohybovat a začne střílet.
Já chci, aby bylo možné za pohybu lodi střílet. Nevíte jak na to?

Zatím to mám napsané tak, že pokud je něco zmáčknuto zacnu podle vstupu hrace menit pozici lode nebo strilet:

[b]Presed key:[/b]
private void HlavniOkno_KeyDown(object sender,KeyEventArgs e)
{
        for (int i = 0; i < SeznamHernichObjektu.Count; ++i)
        {
            SeznamHernichObjektu[i].Item1.VstupHrace(sender, e);
        }
}

[b]Menim pozici:[/b]
public override void VstupHrace(object sender, System.Windows.Forms.KeyEventArgs e)
{
    //if (!backgroundWorker.IsBusy & (e.KeyCode == System.Windows.Forms.Keys.Space))
        //backgroundWorker.RunWorkerAsync(e.KeyCode);
    switch (e.KeyCode)
    {
        case System.Windows.Forms.Keys.Right:
            X += 6;
            break;
        case System.Windows.Forms.Keys.Left:
            X -= 6;break;
        case System.Windows.Forms.Keys.Space:
            Strela NovaStrela = new Strela(this.InstanceHernihoSveta);
            NovaStrela.X = this.X + this.SirkaLode / 2 - SirkaStrely / 2;
            NovaStrela.Y = this.Y;
            InstanceHernihoSveta.PridatObjekt(NovaStrela, true);
            break;
    }
    base.VstupHrace(sender, e);
}

Dík za odpovědi

Odpovědět 10.3.2014 16:06
Kdo to říká ten to je...
Avatar
Odpovídá na Gramli
Luboš Běhounek (Satik):

Musíš upravit vstup - já tohle obvykle řeším tím, že si udělám nějaký seznam (třeba List/pole), do kterého si ukládám stisklé klávesy.
Pak obsluhuješ události KeyDown a KeyUp a jen do toho seznamu nastavuješ, že je stisklá nebo při KeyUp, že ji hráč uvolnil.
A pohyb neřešíš tady při stisku klávesy, ale někde v hlavní smyčce (nebo timeru), která jen zjistí, které všechny klávesy jsou stisknuté a podle toho něco provede.

Pokud to máš v herní smyčce a nemáš nějak na pevno nastavené FPS, tak je pak také dobré brát v úvahu do pohybu to, jak často se to volá - pokud by jsi to při každém volání posouval o 1 pixel a hráč měl 30 fps, tak se za sekundu posune o 30px, ale pokud má 500fps, tak odjede za sekundu strašně daleko.

Nahoru Odpovědět  +1 10.3.2014 16:24
:)
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 2 zpráv z 2.