Hallo Leute,
ich bin zurzeit dabei eine Art Pong zu programmieren.
Ich benutzte dafür die Klassen Engine, Ball, Stick und PaintPanel.
PaintPanel ist für das zeichnen zuständig. Die Variablen sind public.
Um meinen Ball zu bewegen habe ich in der Klasse Engine einen Thread:
Im Thread wird auf die Methode move() von der Klasse Ball zugegriffen:
Diese ändert die Werte (public) der Klasse PaintPanel, welche über repaint() im Thread den Ball zeichnet:
Dies funktioniert alles, weshalb ich nicht verstehe, warum das Bewegen meiner Schläger nicht klappt.
Ich habe in der Klasse Stick einen KeyListener und benutzt folgende Methode:
In der Klasse PaintPanel, sollte eigentlich der Schläger neu gezeichnet werden:
Das Prinzip ist das selbe wie bei dem Ball, außer, dass zum Bewegen kein Thread, sondern der KeyListener benutzt wird.
"Hier" wird noch ausgegeben. Danach folgt diese Fehlermeldung:
Das Programm läuft immernoch normal weiter (der Ball bewegt sich), allerdings gibt es keine Veränderung an meinem Schläger. Das müsste doch bedeuten, dass der Wert der Variable leftStickTop in PaintPanel nicht geänder wurde oder?
Was kann ich jetzt tun, um diesen Fehler zu beseitigen?
Ich hoffe, dass meine Erklärung ausreichend ist und danke schonmal für jeden Versuch mir zu helfen
Grüße
Robin
ich bin zurzeit dabei eine Art Pong zu programmieren.
Ich benutzte dafür die Klassen Engine, Ball, Stick und PaintPanel.
PaintPanel ist für das zeichnen zuständig. Die Variablen sind public.
Um meinen Ball zu bewegen habe ich in der Klasse Engine einen Thread:
Java:
public void run(){
while(true){
panel.requestFocus();
ball.move();
panel.repaint();
try{
Thread.currentThread().sleep(20);
}catch(InterruptedException ex){
System.out.println("Thread Sleep Error");
}
}
}
Im Thread wird auf die Methode move() von der Klasse Ball zugegriffen:
Java:
public void move(){
x_pos += x_speed;
y_pos += y_speed;
panel.x_posBall=x_pos;
panel.y_posBall=y_pos;
isOut();
}
Diese ändert die Werte (public) der Klasse PaintPanel, welche über repaint() im Thread den Ball zeichnet:
Java:
g.fillOval(x_posBall - radius, y_posBall - radius, 2*radius, 2*radius);
Dies funktioniert alles, weshalb ich nicht verstehe, warum das Bewegen meiner Schläger nicht klappt.
Ich habe in der Klasse Stick einen KeyListener und benutzt folgende Methode:
Java:
public void keyTyped(KeyEvent e) {
System.out.println("hier");
firstStickTop++;
panel.leftStickTop=firstStickTop;
}
In der Klasse PaintPanel, sollte eigentlich der Schläger neu gezeichnet werden:
Java:
@Override
public void paintComponent (Graphics g){
super.paintComponent(g);
g.setColor(Color.black);
g.fillOval(x_posBall - radius, y_posBall - radius, 2*radius, 2*radius);
g.drawLine(leftStickX, leftStickTop, leftStickX, leftStickBottom);
}
Das Prinzip ist das selbe wie bei dem Ball, außer, dass zum Bewegen kein Thread, sondern der KeyListener benutzt wird.
"Hier" wird noch ausgegeben. Danach folgt diese Fehlermeldung:
Java:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at warpong.Sticks.keyTyped(Sticks.java:45)
at java.awt.Component.processKeyEvent(Component.java:6218)
at javax.swing.JComponent.processKeyEvent(JComponent.java:2801)
at java.awt.Component.processEvent(Component.java:6040)
at java.awt.Container.processEvent(Container.java:2041)
at java.awt.Component.dispatchEventImpl(Component.java:4630)
at java.awt.Container.dispatchEventImpl(Container.java:2099)
at java.awt.Component.dispatchEvent(Component.java:4460)
at java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1848)
at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(DefaultKeyboardFocusManager.java:704)
at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(DefaultKeyboardFocusManager.java:969)
at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:841)
at java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:668)
at java.awt.Component.dispatchEventImpl(Component.java:4502)
at java.awt.Container.dispatchEventImpl(Container.java:2099)
at java.awt.Window.dispatchEventImpl(Window.java:2475)
at java.awt.Component.dispatchEvent(Component.java:4460)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
Das Programm läuft immernoch normal weiter (der Ball bewegt sich), allerdings gibt es keine Veränderung an meinem Schläger. Das müsste doch bedeuten, dass der Wert der Variable leftStickTop in PaintPanel nicht geänder wurde oder?
Was kann ich jetzt tun, um diesen Fehler zu beseitigen?
Ich hoffe, dass meine Erklärung ausreichend ist und danke schonmal für jeden Versuch mir zu helfen
Grüße
Robin