Reakcja na 2 klawisze jednocześnie

0

Witam. Piszę grę (arkanoida na 2 graczy) do której potrzebna mi jest funkcja dzięki której program obsłuży 2 klawisze jednocześnie:
Sterowanie gracza 1 to : w(góra) , s(dół) a 2 to: o(góra), l(dół).

Sterowanie 1 gracza rozwiązałem następująco:

        public void Form1_KeyPress(object sender, KeyPressEventArgs e)
        {
            klawisz = Convert.ToString(e.KeyChar);
            if (klawisz == "w") panel1.Location = new Point(x, y = y - 1);
            if (klawisz == "s") panel1.Location = new Point(x, y = y + 1);
} 

niestety gdy wciśnięty jest klawisz 1 gracza to 2 wciśniętego nie można wczytać gdyż nawzajem się blokują. Czy ktoś zna sposoby na ominięcie tego ?

0

Może osobne wątki do czytania klawiszy? Może coś z && lub || ?

0

Zestaw niektórych klawiszy na klawiaturze nie pozwala na wciśnięcie kolejnego. Miałem ten problem grając kiedyś we 2 na jednej klawiaturze, ale problem występował gdy wciskane było na raz gdzieś 5 klawiszy - dokładnie nie pamiętam. W każdym razie jest to problem samej klawiatury. U Ciebie są to tylko dwa klawisze na raz?

Pokaż obsługę klawiszy też gracza 2

0

Sterowanie jest zrobione tak samo:

 if (klawisz == "o") panel2.Location = new Point(x, y = y - 1);
            if (klawisz == "l") panel2.Location = new Point(x, y = y + 1);

Gdy mam wciśnięty klawisz np. s to panel1 normalnie porusza się w dół jednak gdy w tym samym czasie inny gracz wciśnie 2 klawisz np. o to klawisz nie zostaje wczytany gdyż dalej jest wciśnięte s. Gra mija się z celem gdy jeden gracz musi przerywać ruch aby ruszyć się mógł 2 gracz.

0

Możesz spróbować zamienić "IF" na "switch" "case" może się to wydać głupie ale w ten sposób skrócisz czas wywołania "KeyDown" i ten czas może wystarczy na twoje potrzeby. Jak używasz "IF" to sprawdza wszystkie i czas się wydłuża.

0

Aż się za głowę łapię jak czytam ten wątek.
Tak na pierwszą myśl - jak wciskasz kolejny klawisz, to ten poprzedni jest już kliknięty, więc wyrzuca tylko wciskanie nowego klawisza. Spróbuj to jakoś obejść.

0

Imo jeśli to gierka możesz zrobić jakąś pętle główną i tam przypisuj odpowiednio wciśnięte klawisze np. do gracz1,gracz2 i wtedy wykonuj odpowiednie działanie.

0
Dymitron napisał(a)

może się to wydać głupie

Bo to jest głupie.

Możesz obsłużyć KeyDown i KeyUp, i ustawiaj w nich flagi czy klawisz jest wciśnięty.

Lepiej jednak zainstaluj sobie XNA, tam takie rzeczy są już obsłużone.

1 użytkowników online, w tym zalogowanych: 0, gości: 1