Hallo an alle,
ich hatte bereits vor ca einer Woche ein Problem mit den KeyEvents in Java. Glücklicherweise lies sich der Überltäter in meinem Programmtext schnell finden.
Nun habe ich eine zweite Version meines Pong Klons geschrieben und möchte diesen selbstverständlich auch über KeyListener und Events steuern. Leider kommen die Tastenanschläge nicht beim Listener an. Dieser soll auf dem gesamten Fenster lauschen; er ist also nicht an eine bestimmte Komponente gebunden (Deshalb erzeuge ich ihn im Kosntruktor).
Innerhalb der run() lasse ich mir den aktuellen Wert der variablen rungame ausgeben, die bei einem KeyEvent eigentlich ihren Zustand ändern müsste.
Hier nochmal die wichtigen Zeilen:
[JAVA=66]
addKeyListener(new Tastatur());
[/code]
[JAVA=164]
public class Tastatur extends KeyAdapter {
public void KeyPressed (KeyEvent e){
if (e.getKeyCode()==KeyEvent.VK_ESCAPE){
System.out.println("KeyEvent: " + e.getKeyCode());
System.exit(0);
}
if (e.getKeyCode()==KeyEvent.VK_P){
System.out.println("KeyEvent: " + e.getKeyCode());
rungame = !(rungame);
}
}
public void KeyTyped (KeyEvent e){
if (e.getKeyCode()==KeyEvent.VK_ESCAPE){
System.out.println("KeyEvent: " + e.getKeyCode());
System.exit(0);
}
if (e.getKeyCode()==KeyEvent.VK_P){
System.out.println("KeyEvent: " + e.getKeyCode());
rungame = !(rungame);
}
}
}
[/code]
Auch wenn ich in Zeile 166 alle potenziellen KeyEvents auf die Konsole schreiben lasse, wird nichts ausgegeben. ???:L
Danke für eure Hilfe
Viele Grüße
earlgrey_tea
ich hatte bereits vor ca einer Woche ein Problem mit den KeyEvents in Java. Glücklicherweise lies sich der Überltäter in meinem Programmtext schnell finden.
Nun habe ich eine zweite Version meines Pong Klons geschrieben und möchte diesen selbstverständlich auch über KeyListener und Events steuern. Leider kommen die Tastenanschläge nicht beim Listener an. Dieser soll auf dem gesamten Fenster lauschen; er ist also nicht an eine bestimmte Komponente gebunden (Deshalb erzeuge ich ihn im Kosntruktor).
Java:
//package MyPong;
import java.awt.*;
import java.awt.event.*;
import java.awt.Graphics;
/**
* @author thorsten
*
*/
public class TestBall extends Frame implements Runnable{
// Verbunddatentypen:
Thread mythread;
// Konstanten
public final int WAIT = 50;
public final int PADDLEHEIGHT = 40;
public final int PADDLEWIDTH = 5;
public final int BALLHEIGHT = 10;
public final int BALLWIDTH = 10;
// Steuerungsvariablen
boolean rungame = true;
// FensterWerte
int maxX, maxY, minX, minY, middleY;
// PaddleVariablen
int p1x, p1y, p2x, p2y;
int p1maxX;
int p2maxX;
int paddle1_mv, paddle2_mv;
// BallVariablen
int x ; // definiert die StartPosition
int y ; // " s.o
int speedX = 10;
int speedY = 5;
int punkte_Sp1 = 0;
int punkte_Sp2 = 0;
public TestBall (){
setTitle("Der hüpfende Ball");
setSize(100, 100);
setLayout(null);
setBounds(10,10,300,300);
setVisible(true);
setBackground(Color.black);
// Ermittelt wichtige Werte des BESCHREIBBAREN Fensters
maxX=getSize().width-getInsets().left-getInsets().right;
maxY=getSize().height-getInsets().top-getInsets().bottom;
minX=getInsets().left;
minY=getInsets().top;
middleY = (maxY + minY) / 2;
// Hier werden die Bedienmethoden für das Fenster, etc bereitgestellt.
addWindowListener(new WindowAdapter(){
public void windowClosing (WindowEvent e){
System.exit(0);
}
});
addKeyListener(new Tastatur());
}
public void paint(Graphics g){
g.setColor(Color.red);
g.drawString("Punkte Sp1: " + Integer.toString(punkte_Sp1), minX, minY + 20);
g.drawString("Punkte Sp2: " + Integer.toString(punkte_Sp2), maxX - 90, minY + 20);
// Paddle 1
g.setColor(Color.white);
g.fillRect(p1x, p1y, PADDLEWIDTH, PADDLEHEIGHT);
// Paddle 2
g.setColor(Color.white);
g.fillRect(p2x, p2y, PADDLEWIDTH, PADDLEHEIGHT);
// Ball
g.setColor(Color.white);
g.fillOval(x, y, BALLHEIGHT, BALLWIDTH);
if (!(rungame)){
g.setColor(Color.yellow);
g.drawString("PAUSE", (maxX + minX) / 2, middleY);
}
}
public void moveBall (){
if (x <= minX || x >= maxX)
{
speedX *= -1;
}
if (y <= minY || y >= maxY){
speedY *= -1;
}
x+=speedX;
y+=speedY;
}
public void movePaddle (){
// ggf. die Methode Kollision Paddle nennen
if (p1x >= minX){
p1x = minX;
}
if (p2x >= minX){
p2x = minX;
}
if (p1maxX <= maxX){
p1maxX = maxX;
}
if (p2maxX <= maxX){
p2maxX = maxX;
}
// noch nicht instanziert!!!
p1x += paddle1_mv;
p2x += paddle2_mv;
}
public void initializeGame(){
// Initialisiere Startpositionen des Balls:
x = minX + 10;
y = minY + 15; // sonst verschwindet der Ball in der oberen Leiste
// Initialiere die Werte des Schlägers
p1x = minX;
p1y = middleY;
p2x = maxX;
p2y = middleY;
p1maxX = p1x + PADDLEHEIGHT;
p2maxX = p2x + PADDLEHEIGHT;
}
public boolean ballImAus (){
// quasi die schaut, ob der Ball im Aus gelandet ist
return false;
}
public void run(){
while (true ){
try {
mythread.sleep(WAIT);
} catch (InterruptedException ex) {}
while (rungame){
try {
mythread.sleep(WAIT);
} catch (InterruptedException ex) {}
moveBall();
repaint();
System.out.println(rungame);
}
}
}
public class Tastatur extends KeyAdapter {
public void KeyPressed (KeyEvent e){
System.out.println("KeyEvent: " + e.getKeyCode());
System.out.println("KeyEvent: " + e.getKeyCode());
if (e.getKeyCode()==KeyEvent.VK_ESCAPE){
System.out.println("KeyEvent: " + e.getKeyCode());
System.exit(0);
}
if (e.getKeyCode()==KeyEvent.VK_P){
System.out.println("KeyEvent: " + e.getKeyCode());
rungame = !(rungame);
}
}
public void KeyTyped (KeyEvent e){
if (e.getKeyCode()==KeyEvent.VK_ESCAPE){
System.out.println("KeyEvent: " + e.getKeyCode());
System.exit(0);
}
if (e.getKeyCode()==KeyEvent.VK_P){
System.out.println("KeyEvent: " + e.getKeyCode());
rungame = !(rungame);
}
}
}
public static void main(String[] args) {
TestBall b = new TestBall();
b.initializeGame();
b.run();
}
}
Innerhalb der run() lasse ich mir den aktuellen Wert der variablen rungame ausgeben, die bei einem KeyEvent eigentlich ihren Zustand ändern müsste.
Hier nochmal die wichtigen Zeilen:
[JAVA=66]
addKeyListener(new Tastatur());
[/code]
[JAVA=164]
public class Tastatur extends KeyAdapter {
public void KeyPressed (KeyEvent e){
if (e.getKeyCode()==KeyEvent.VK_ESCAPE){
System.out.println("KeyEvent: " + e.getKeyCode());
System.exit(0);
}
if (e.getKeyCode()==KeyEvent.VK_P){
System.out.println("KeyEvent: " + e.getKeyCode());
rungame = !(rungame);
}
}
public void KeyTyped (KeyEvent e){
if (e.getKeyCode()==KeyEvent.VK_ESCAPE){
System.out.println("KeyEvent: " + e.getKeyCode());
System.exit(0);
}
if (e.getKeyCode()==KeyEvent.VK_P){
System.out.println("KeyEvent: " + e.getKeyCode());
rungame = !(rungame);
}
}
}
[/code]
Auch wenn ich in Zeile 166 alle potenziellen KeyEvents auf die Konsole schreiben lasse, wird nichts ausgegeben. ???:L
Danke für eure Hilfe
Viele Grüße
earlgrey_tea