2 Tasten drücken mit Java

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

2 Tasten drücken mit Java
Servus Leute,

mein Kumpel und ich haben ein kleines Snake-Programm geschrieben. Wir haben auch einen 2-Player-Modus eingebaut… :smiley:

Das Problem ist, dass Java immer nur einen Tastendruck registriert. → Haben es sowohl mit einem KeyListener (KeyReleased und KeyPressed) als auch mit der KeyDown-Methode probiert…

Problem ist, wenn einer der beiden Spieler eine Taste gedrückt hält, kann der andere gar nichts mehr machen. (sehr fies!)

Nun zur Problemlösung:
ich hab mich im Internet kundig gemacht und in einigen Foren gefunden, dass in Java nur eine Taste registriert werden kann → stimmt das? Wenn nein: wie kann man 2 Tasten gleichzeitig verarbeiten?
Alternative:
Gibt es einen Befehl um ein Event wieder frei zu geben? Wenn am Ende der KeyDown-Methode das Event wieder freigegeben würde (also nach der Bearbeitung), würde zumindest die “Taste-gedrückt-halten-Sperre” nicht mehr funktionieren (und exakt gleichzeitig schafft man wahrscheinlich eh nie eine Taste zu drücken)
Anmerkung: (Event) e = null; hat nicht funktioniert!

Für andere Lösungsvorschläge wäre ich natürlich auch dankbar :wink:
Thx schon mal…


Dass Java nur eine Taste gleichzeitig verarbeiten kann ist blödsinn :wink: .

Grob gesagt funktionierts so: die JVM pollt das OS nach gedrückten Tasten und bastelt daraus die Events, die es dann an die Java-Applikation schickt. Die Event-Callbacks (vom Event-Listener) werden von einem Thread aufgerufen (der “AWT-Thread”). So etwas wie Events “freigeben” gibts nicht, da ein Event nicht mehr als eine Nachricht an dein Programm ist…

Ich kann jetzt nur raten, aber könnte es sein, dass ihr irgendwelchen Code direkt im Event-Callback ausführt? Das blockiert den AWT-Thread natürlich und er kann keine neuen Events verschicken. Deswegen gilt: In Event-Callbacks immer so wenig Code wie möglich ausführen. Aber am besten du postest mal den Code, dann kann man dir genauer helfen.

So long

  • Sven

stimmt. Das problem liegt naemlich schon auf Hardware ebene, Tastaturen koennen naemlich per Design nur eine Taste auswerten!
(„Aber ich kann doch in quake links strafen und vorwaerts laufen?!?!?!?!“ - Ja, das liegt daran dass du die tasten niemals gleichzeitig drueckst, sondern zuerst den keypress fuer link, danach den keypress fuer forward, beim loslassen kommt natuerlich ein keyrelease fuer forward und left)

Die Lösung ist ultrasimpel: im KeyPressed handler einfach ein leftKeyPressed = true; rein und im KeyReleased handler einfach leftKeyPressed = false;
(mehr nicht, diese methoden duerfen nicht blocken)


[gelöscht]


wow, super Leute… :wink:

ja doch, ich denke das hilft weiter…

Ist ja interessant… Ich denke ich werde es über booleans und keyTyped/keyPressed realisieren… Das mit den vielen Threads übersteigt (noch) meinen Horizont (im 1. Sem ^^). Hab zwar schon was über „Multithreading“ gelesen, aber so ganz klar ist das mir nicht… Und schließlich muss ich es ja debuggen… :smiley:

Also nochma THX!


mir blutet das Herz


…mir auch…


same.
Gaaanz uebler code.


ahahaha


Wie wäre es mit konstruktiver Kritik, beispielsweise in Form von Links zu Hinweisen, wie man es anständig löst?


http://www.cokeandcode.com/info/tut2d.html

Here you go.
Es ist aber im wesentlichen die gleiche Lösung die ich weiter oben angepriesen habe.


sorry, ich wollte nur helfen. Bei mir hats funktioniert, so ein “bullshit” kanns also nicht gewesen sein.

Wenn Mr. Java und dem Dipl. Gamer das Herz blutet, nehm ich die Lösung natürlich wieder raus.

<_<


Naja funktionieren ist das eine, aber für jeden Tastendruck nen neuen Thread? :wink:


Es war für diesen Fall einfach inappropriate, „Kanonen auf Spatzen“


Stimmt. Wenns funktioniert muss es gut sein. Ich haette mir aber eine C Loesung mit fork und signalen gewuenscht. Eine alternative MPI Implementierung haette mir auch gefallen. Noch einfacher waere hier aber, den Key in eine Datenbank zu schreiben, und dann spaeter wieder auszulesen. Wenn du Probleme mit dem jdbc hast, koenntest du alternativ einen wrapper nehmen, der dir eine XML ausgabe erzeugt um dann mit einem DOM Parser nach DEINETASTE zu suchen.


sehr konstruktive Diskussion… Aber trotzdem danke für die Hilfestellungen


Wie wärs für jeden Tastendruck eine Datei anzulegen? Dann nur noch im main loop auf vorhandensein der Tastendatei prüfen!


Man könnte diese Dateien auch bei Microsoft in die Cloud setzen. Dann zahlt man auch nur für tatsächlich genutzte Ressourcen und muss keinen überdimensionierten Server hinstellen.


Beim Verarschen stehen sie wieder Schlange…