Verbesserter KeyListener

Wolfy0013

Mitglied
Hallo, liebe Mitprogrammierer!
Ich bin dabei ein Spiel zu programmieren und habe mir lange Zeit nicht besonders Sorgen um den KeyListener gemacht, auch wenn ich schon eine Macke entdeckt hatte.
Das Problem ist, dass man in meinem Spiel zu viert spielt und unter anderem mit einem Geschoß schiessen muss. Und je nachdem, wie lange man auf der Taste bleibt, steigt eine Anziege mit Abschußkraft.
Wenn nun aber, während ein anderer ladet, eine andere Tast drückt bzw. selbst aufladet, merkt man ein deutliches Hängen in beiden Statusleisten.
Der Keylistener stoppt also kurz bevor er wieder das drücken registriert (Die Methode mit Booleans ist bereits in Verwendung).
Nun würde ich also gerne von euch wissen, ob es das eine Lösung zum Selbstschreiben gibt oder ob möglicherweise ein verbesserter KeyListener schon von jemandem geschrieben wurde (Ich habe Google bereits gründlich abgegrast)!

Ich bedanke mich im Vorraus,
Wolfy
 
Der KeyListener arbeitet so wie er soll :D
Allerdings hast du ihn wahrscheinlich etwas "falsch (kann man so nicht direkt sagen)" implementiert.

Hier hast du mal ein ganz grobes Beispiel, wie ich das in einem Spiel implementiere, um dein beschriebenes Problem zu umgehn:

Java:
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.concurrent.TimeUnit;

import javax.swing.JFrame;

@SuppressWarnings("serial")
public class Foo extends JFrame {
	private static final int FPS = 100;
	
	private boolean loadPlayer1 = false, loadPlayer2 = false, loadPlayer3 = false, loadPlayer4 = false;
	
	public static void main(String[] args) {
		try {
			new Foo();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
	
	public Foo() throws InterruptedException {
		addKeyListener(new KeyInputHandler());
		
		setSize(800, 600);
		setLocationRelativeTo(null);
		setResizable(false);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setVisible(true);
		
		gameLoop();
	}
	
	private void gameLoop() throws InterruptedException {
		long lastGameLoopTime = System.currentTimeMillis();
		
		while(true) {
			long delta = System.currentTimeMillis() - lastGameLoopTime;
			lastGameLoopTime = System.currentTimeMillis();
			
			if(loadPlayer1) {
				System.out.println("Player 1 loading..");
			}
			
			if(loadPlayer2) {
				System.out.println("Player 2 loading..");
			}
			
			if(loadPlayer3) {
				System.out.println("Player 3 loading..");
			}
			
			if(loadPlayer4) {
				System.out.println("Player 4 loading..");
			}
			
			TimeUnit.MILLISECONDS.sleep(1000 / FPS);
		}
	}
	
	private class KeyInputHandler extends KeyAdapter {
		@Override
		public void keyPressed(KeyEvent e) {
			if(e.getKeyCode() == KeyEvent.VK_SPACE) {
				loadPlayer1 = true;
			} else if(e.getKeyCode() == KeyEvent.VK_NUMPAD0) {
				loadPlayer2 = true;
			} else if(e.getKeyCode() == KeyEvent.VK_S) {
				loadPlayer3 = true;
			} else if(e.getKeyCode() == KeyEvent.VK_UP) {
				loadPlayer4 = true;
			}
		}
		
		@Override
		public void keyReleased(KeyEvent e) {
			if(e.getKeyCode() == KeyEvent.VK_SPACE) {
				loadPlayer1 = false;
			} else if(e.getKeyCode() == KeyEvent.VK_NUMPAD0) {
				loadPlayer2 = false;
			} else if(e.getKeyCode() == KeyEvent.VK_S) {
				loadPlayer3 = false;
			} else if(e.getKeyCode() == KeyEvent.VK_UP) {
				loadPlayer4 = false;
			}
		}
	}
}
 
Zuletzt bearbeitet:
Zurück