Gibt es eine Methode in Java, mit der Tastendruck abgefragt werden kann?
Guten Abend,
ich arbeite momentan an einem Projekt für die Schule, nämlich Pong (https://de.wikipedia.org/wiki/Pong), für welches ich die sogenannte Shapes and Sprites Bibliothek verwende, welche für zweidimensionale Projekte im Rahmen des schulischen Unterrichtes gedacht ist.
Soo, nun habe ich das grundlegende Spiel fertig programmiert und bin gerade dabei, einige neue Features zu implementieren, zu denen unter Anderem ein Computergegner gehört. Um das zu realisieren habe ich mir gedacht, dass wenn der Benutzer die Taste c drückt, der rechte Schläger nicht mehr über die Pfeiltasten (Über diese wird der Schläger nämlich bedient) erreichbar ist. Nun besteht die Möglichkeit, mittels der Methode tastaturobjekt.isPressed('c') abzufragen, ob die Taste c gedrückt wird.
Nun habe ich sowohl mit einem Integer computer = 0, dessen Wert einfach um 1 erhöht wird, wenn c gedrückt wird, als auch mit einem Boolean, über eine If-Verzweigung mit der Bedingung, dass der Integer-Wert = 0 bzw der Boolean istGedrueckt = false ist, den Schläger angewiesen, bei Druck der Pfeiltaste gedrückt zu werden, also quasi wie folgt:
if(tastatur.down() && schläger2.getShapeY()<495 && (istGedrueckt == false)){
schläger2.move(0,10);
}
(getShapeY gibt hierbei die Y-Koordinate des Objekts an)
Nur leider besteht hierbei das Problem, dass der Schläger nur dann nicht mehr manuell bewegt werden kann, wenn C tatsächlich gedrückt gehalten wird und nicht nach einmaligem Druck. Deshalb lautet meine Frage, ob das JDK vielleicht eine Möglichkeit mit sich bringt, nach Möglichkeit ohne zehntausend andere Bibliotheken, einen Tastendruck zu überprüfen.
Das soll keine Bitte sein, meine Hausaufgaben zu erledigen, ich will keinen konkreten Quelltext für mein Projekt, sondern bitte einfach nur eine Antwort auf diese mehr oder weniger (ich hoffe) simple Frage, da Google mir dabei leider keine besonders hilfreichen Ergebnisse geliefert hat.
Liebe Grüße, Adrian.
5 Antworten
Versuch es mal mit einer abfrage ob c gedrückt ist die den boolian IstGedrückt auf true setzt wenn IstGedrückt auf false ist, oder auf false gesetzt wird wenn er gerade auf true ist.
Danke für Deine Antwort.
Das hab ich auch schon versucht, leider klappt auch das nicht.
Bei meinem Grafiksystem ist das so, dass ich sowohl für das Drücken als auch für das Loslassen einer Taste eine Aktion auslösen kann. Schau mal in Deinen Unterlagen nach, ob das in Java auch so ist. Dann könntest beim Drücken der Taste eine Sperre setzen, die beim Loslassen wieder aufgehoben wird. Außer dem Drücken einer Taste habe ich auch eine eine Option, die Taste mit dem Mauszeiger nur zu berühren, also darüberzufahren und wieder entfernen. Ich kann mir nicht vorstellen, dass mein 30 Jahre altes Dialogsystem mehr kann als Java.
Nimm einen KeyListener.
https://docs.oracle.com/javase/tutorial/uiswing/events/keylistener.html
Wenn du einem java.awt. Component einen KeyListener zuweist, wir diesem als KeyListener registrierten Objekt jedes Mal Bescheid gesagt, wenn etwas passiert.
Wenn ihr externe libaries benutzen dürft, lade dir lwjgl 2.9.3 herunter und installiere es. Wenn du nicht weist wie es geht erkläre ich es dir gerne nochmal. Einfach schreiben. Darin gibt es eine Klasse die sich Keyboard nennt.
if(Keyboard.isKeyPressed(Keyboard.Key_VK_C)){
}
Oder so ähnlich. Gibe einfach Keyboard.isKey ein und Eclipse sagt dir den Rest.
LG Actyc
Du solltest einfach einen boolean erstellen, der angibt, ob der Computergegner aktiv ist. Dann überprüfst du bei der Steuerung von Spieler 2, ob das der Fall ist.
if steuerung_für_spieler_2
if !computergegner_aktiv
bewege_spieler_2
if computer_gegner_aktiv
bewege_computer
if c_gedrückt
if computergegner_aktiv
computergegner_aktiv = false
else
computergegner_aktiv = true
Mit 'C' schaltest du dann einfach zwischen diesen Modi um. So könnte auch direkt in einem Spiel zwischen Computergegner und menschlichem Spieler 2 umgeschalten werden.
Danke für Deine Antwort!
Ich bin ein bisschen doof, wie implementiere ich den KeyListener jetzt genau? Ich würde die Methode keyTyped() benutzen, weiß aber nicht ganz, wie das mit dem keyListener funktioniert; bzw verstehe das nicht ganz.