Reakcja na 2 klawisze jednocześnie

Reakcja na 2 klawisze jednocześnie
PA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 6
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:

Kopiuj
        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 ?

nerf
  • Rejestracja: dni
  • Ostatnio: dni
0

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

Sarrus
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2512
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

PA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 6
0

Sterowanie jest zrobione tak samo:

Kopiuj
 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.

DY
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 33
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.

siararadek
  • Rejestracja: dni
  • Ostatnio: dni
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ść.

nerf
  • Rejestracja: dni
  • Ostatnio: dni
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.

CH
  • Rejestracja: dni
  • Ostatnio: dni
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.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.