Gleichzeitiges Steuern von 2 Objekten über Tastatur

Status
Nicht offen für weitere Antworten.

TeacherMC

Mitglied
Hallo,

wir arbeiten an einem Spiel "Breakout"

in dem Spiel soll mit 2 "Schägern", welche einfach Buttons sind ein Ball hin und her gespielt werden.
Das ansteuern der JButtons mithilfe des KeyListeners und das setzen der neuen Position
ist kein Problem.

Das einzige Problem ist, wenn beide Spieler eine Taste festhalten.
Dann wird eine Taste im Tastaturpuffer gehalten, und die andere kommt erst zum Zug, wenn der
erste Spieler die Taste kurz los läßt.

Hat jemand eine Idee?
 
B

Bradan

Gast
Doctus: Multithreading allein bringt nicht viel bei dem Konzept des KeyListeners. Java ist in dieser Hinsicht für mich sowieso keine Ideale Sprache. In jeder anderen (Nativ WinAPI fähigen) Sprache würde man standardmäßig GetAsyncKeyState(int VirtualKeycode) verwenden.

Eine Lösung wäre das hier:

Code:
import java.awt.BorderLayout;
import javax.swing.JPanel;
import java.awt.GraphicsConfiguration;
import java.awt.HeadlessException;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JFrame;

public class GUI extends JFrame implements KeyListener, Runnable {

	private JPanel jContentPane = null;
	private boolean[] action;
	private Thread derThread;

	public GUI() {
		super();
		action = new boolean[256];
		for (int i = 0; i < action.length; i++) {
			action[i] = false;
		}
		initialize();
		
		addKeyListener(this);
		
		derThread = new Thread(this);
		derThread.start();
	}

	/**
	 * This method initializes this
	 * 
	 * @return void
	 */
	private void initialize() {
		this.setSize(0, 200);
		this.setContentPane(getJContentPane());
		this.setTitle("JFrame");
		this.addWindowListener(new java.awt.event.WindowAdapter() {
			public void windowClosing(java.awt.event.WindowEvent e) {
				System.exit(0);
			}
		});
	}

	/**
	 * This method initializes jContentPane
	 * 
	 * @return javax.swing.JPanel
	 */
	private JPanel getJContentPane() {
		if (jContentPane == null) {
			jContentPane = new JPanel();
			jContentPane.setLayout(new BorderLayout());
		}
		return jContentPane;
	}

	public void keyTyped(KeyEvent e) {
	}

	public void keyPressed(KeyEvent e) {
		action[e.getKeyCode()] = true;
	}

	public void keyReleased(KeyEvent e) {
		action[e.getKeyCode()] = false;
	}

	public void run() {
		while(true) {
			
			for (int i = 0; i < action.length; i++) {
				if(action[i] == true) {
					System.out.println("Taste: "+KeyEvent.getKeyText(i));
				}
			}
			
			try {
				Thread.sleep(1000 / 3);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}

}

Bei keyPressed() wird der Wert für den Tastencode auf "true" gesetzt bis zum keyReleased. Der Thread aktualisiert die Nachrichten auf der Konsole 3 mal pro Sekunde. Ein großes Problem bei der Sache ist, dass wenn das Fenster den Fokus verliert und ein keyReleased noch offen steht, es den Tastendruck trotzdem weiterhin als gedrückt wahrnimmt.
Eine andere Lösung wäre das einbinden von org.eclipse.... (alternativ auch NativeCall) mit der abstrakten Klasse OS. Dann könnte man direkt mit OS.GetAsyncKeyState() die Taste überprüfen.
 

Quaxli

Top Contributor
Der oben beschriebene Code funktioniert in Java wunderbar und diese Lösung ist im Prinzip eine Standardvorgehensweise im Rahmen der Spieleprogrammierung.
Allerdings würde ich für die benötigten 4 - 6 Tasten jeweils einen Boolean definieren.
Das oben gezeigte, 256 Felder große, Boolean-Array wäre mir (außer zu Demo-Zwecken) zu umständlich.
 

Bradan

Mitglied
Quaxli hat gesagt.:
Der oben beschriebene Code funktioniert in Java wunderbar und diese Lösung ist im Prinzip eine Standardvorgehensweise im Rahmen der Spieleprogrammierung.
Allerdings würde ich für die benötigten 4 - 6 Tasten jeweils einen Boolean definieren.
Das oben gezeigte, 256 Felder große, Boolean-Array wäre mir (außer zu Demo-Zwecken) zu umständlich.

:) Klar, für die paar Tasten könnte man einfach einzelne Variablen nutzen, aber bei mehreren wirds unübersichtlich und umständlich, gerade wenn man die Steuerung anpassbar halten will. :autsch: Außerdem hab ich das in mehreren Spielen schon mit einzelnen Variablen gemacht und jedes mal musste ich nachschauen wie ich nun die Variable genannt hab (Sowas wie IntelliSense Autovervollständigung hat leider nicht jeder). In meinen neuen Projekten sieht es schön übersichtlich aus. Das nervt sonst tierisch, wenn man den VK-Code weiß, aber nicht die Variable.
 

TeacherMC

Mitglied
Vielen Dank für den Lösungsvorschlag.

Das funktioniert natürlich super, Danke.
Werde ich gleich an meine Schüler so weitergeben.

Einfach Klasse Leute.

Gruß

Niko
 

fl3xX

Neues Mitglied
hab mir den code auch mal angesehen. funktionier an sich auch sehr gut. nun will ich jedoch, dass wenn "s" gedrück wird eine variable erhöht wird und bei Druck auf "a" soll die variable kleiner werden. jedoch macht er das nicht. hilfe von nöten..
Code:
public void run() {
	      while(true) {
	         
	         for (int i = 0; i < action.length; i++) {
	            if(action[i] == true) {
	            	panel.label2.setText("Taste: >"+KeyEvent.getKeyText(i)+ "<");
		        if(KeyEvent.getKeyText(i) == "A" ){
		            	canvas.p1x -= 5;
		        }
		        if(KeyEvent.getKeyText(i) == "S"){
		            	canvas.p1x += 5;
		        }
	            }
	         }
	      }
	   }
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
O Ein Java-Programm mit Swing steuern AWT, Swing, JavaFX & SWT 1
F JTextarea Steuern ~ consolenanbindung AWT, Swing, JavaFX & SWT 5
A Flug Drone steuern "DronePosition" NetBeans AWT, Swing, JavaFX & SWT 4
E PingPong über Servlet steuern AWT, Swing, JavaFX & SWT 3
Burny91 Swing Thread mit wait() und notify() steuern AWT, Swing, JavaFX & SWT 22
B Externes Programm mit Robot Steuern AWT, Swing, JavaFX & SWT 3
O Focus im GBL steuern. AWT, Swing, JavaFX & SWT 3
O TextBoxen Focus über Pfeiltasten steuern AWT, Swing, JavaFX & SWT 3
M Frame steuern AWT, Swing, JavaFX & SWT 3
H ein JTree soll einen 2. JTree steuern AWT, Swing, JavaFX & SWT 11
V JList mit Events Steuern ? AWT, Swing, JavaFX & SWT 15
D JTable - Auto-Selektion NACH Zelleditierung steuern AWT, Swing, JavaFX & SWT 2
V Brauche Hilfe beim Steuern des Sichtbereiches eines JPanel AWT, Swing, JavaFX & SWT 2
Encera ArrayList mit eigenen Objekten in JavaFX sortieren und ausgeben AWT, Swing, JavaFX & SWT 50
ExceptionOfExpectation MouseListener-Objekte zu den Graphics-Objekten einfügen AWT, Swing, JavaFX & SWT 3
W Clear Canvas und anschließendes neues Erstellen von Objekten auf Canvas aus ArrayList AWT, Swing, JavaFX & SWT 4
J Drag and Drop von eigenen Objekten AWT, Swing, JavaFX & SWT 3
I Umgang mit vielen Objekten AWT, Swing, JavaFX & SWT 3
J LayoutManager GridBagLayout, probleme mit Anordnung von Objekten AWT, Swing, JavaFX & SWT 6
perlenfischer1984 JavaFX : JTreeView mit verschieden Objekten AWT, Swing, JavaFX & SWT 0
M Java FX Dreidimensionale Anordnung von Objekten AWT, Swing, JavaFX & SWT 4
P Swing Validieren von deserializierten Objekten AWT, Swing, JavaFX & SWT 2
P Vorteile von Tooltip nutzen (wird über allen anderen Objekten angezeigt) AWT, Swing, JavaFX & SWT 3
I Paint-Methode von nicht statischen Objekten aufrufen AWT, Swing, JavaFX & SWT 3
G JavaFX Binding von Objekten AWT, Swing, JavaFX & SWT 4
P Swing JList mit Objekten - Name anzeigen AWT, Swing, JavaFX & SWT 5
J Mit mehreren in Objekten in JFrame printen? AWT, Swing, JavaFX & SWT 8
D animierte kameraansicht zwischen gezeichneten objekten AWT, Swing, JavaFX & SWT 4
1 Liste mit Objekten Füllen AWT, Swing, JavaFX & SWT 7
M JList mit 2-zeiligen Objekten füllen AWT, Swing, JavaFX & SWT 7
M Verschwinden von gezeichneten Objekten nach Fensterverkleinerung AWT, Swing, JavaFX & SWT 3
B Swing Laden von serialisierten Objekten (invalid type code AC)) AWT, Swing, JavaFX & SWT 3
C Swing Drag and Drop mit Objekten in einem Fenster. AWT, Swing, JavaFX & SWT 9
M PropertyChangeListener - JTable bei neuen Objekten updaten? AWT, Swing, JavaFX & SWT 3
M JTable Sortierung - -zeilenweise mit Objekten verknüpfen AWT, Swing, JavaFX & SWT 4
X JTable mit verschiedenen Objekten füllen AWT, Swing, JavaFX & SWT 14
S AWT Pong - Probleme mit übergreifenden Objekten && Graphics2D AWT, Swing, JavaFX & SWT 3
S Spielfeld mit unförmigen Objekten anklickbar machen? AWT, Swing, JavaFX & SWT 4
T Sichtbarmachen von Objekten auf mehreren JPanels AWT, Swing, JavaFX & SWT 2
W setEnabled in Container Objekten (JScrollPane) AWT, Swing, JavaFX & SWT 5
Q Dynamische Zahl und Positionierung von Objekten AWT, Swing, JavaFX & SWT 5
L JPanel mit Objekten selektieren wie unter Windows / Ubuntu AWT, Swing, JavaFX & SWT 4
T Swing KeyListener mit mehreren Objekten AWT, Swing, JavaFX & SWT 2
P JTable:Sortierung nach der Zeit/Spalte mit Calendar-Objekten AWT, Swing, JavaFX & SWT 2
M Probleme beim Hinzufügen von Objekten zu getContentPane() AWT, Swing, JavaFX & SWT 2
T Drag&Drop mit Objekten! Grundsätzlich. AWT, Swing, JavaFX & SWT 3
C Positionieren von Objekten AWT, Swing, JavaFX & SWT 11
I Größe von Swing-Objekten ändern AWT, Swing, JavaFX & SWT 13
A Attribute von Objekten in JTable-Zeilen anzeigen AWT, Swing, JavaFX & SWT 2
S JTree mit eigenen Objekten füllen AWT, Swing, JavaFX & SWT 4
S Problemen mit Canvas-Objekten im GridLayout AWT, Swing, JavaFX & SWT 8
N JPanels von Objekten AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben