[英]adding keylistener returns null pointer exception
我正在學習用Java編程2D游戲已有一段時間了。 在我最新的游戲中,我試圖創建一個私有類來處理Player類中的鍵事件,我這樣做是這樣的:
package game;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
public class Player {
final private int MOVEMENTSPEED = 4;
final private int BOOST = 8;
final private EventHandler HANDLER = new EventHandler();
private int x, y;
private int speedX, speedY;
public Player(int x, int y){
this.x = x;
this.y = y;
}
public void update(){
x += speedX;
y += speedY;
}
public int getSpeedX() {
return speedX;
}
public int getSpeedY() {
return speedY;
}
public int getX() {
return x;
}
public int getY() {
return y;
}
public EventHandler getHandler(){
return HANDLER;
}
private class EventHandler implements KeyListener{
@Override
public void keyPressed(KeyEvent e) {
switch(e.getKeyCode()){
case KeyEvent.VK_W: speedY = -MOVEMENTSPEED;
break;
case KeyEvent.VK_S: speedY = MOVEMENTSPEED;
break;
case KeyEvent.VK_A: speedX = -MOVEMENTSPEED;
break;
case KeyEvent.VK_D: speedX = MOVEMENTSPEED;
break;
}
}
@Override
public void keyReleased(KeyEvent e) {
switch(e.getKeyCode()){
case KeyEvent.VK_W: speedY = 0;
case KeyEvent.VK_S:
break;
case KeyEvent.VK_A: speedX = 0;
case KeyEvent.VK_D:
break;
}
}
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
}
在這里,我嘗試將eventHandler類添加到處理游戲循環,繪畫等的類中:
public class FrameWork extends Applet implements Runnable {
private URL base;
private Graphics second;
private Image image;
public static Player p;
@Override
public void start() {
p = new Player(400, 400);
Thread thread = new Thread(this);
thread.start();
}
@Override
public void init() {
setSize(1000, 600);
setFocusable(true);
Frame frame = (Frame) this.getParent().getParent();
frame.setTitle("Assassin");
frame.setResizable(false);
**this.addKeyListener(p.getHandler());**
}
我已經使用過keylistener,但沒有額外的類(在游戲循環的同一類中實現方法),或者通過創建完全不同的類並使用其實例來完成它。
無論如何,我嘗試以不同的方式進行操作,因為它看起來更舒適,但它始終返回錯誤java.lang.NullPointerException,我不明白為什么。
感謝幫助
Applet
的生命周期從init
開始,然后再調用start
。 您可以在init
之后調用的start
初始化播放器,因此init
中的p
為null。
在init
方法中創建播放器。
嘗試進行以下更改:
init()
方法而不是start()
方法中初始化此變量。 public Player p; //changed this to be an instance variable (non-static)
@Override
public void start() {
//moved initialization of player to init() method
Thread thread = new Thread(this);
thread.start();
}
@Override
public void init() {
setSize(1000, 600);
setFocusable(true);
Frame frame = (Frame) this.getParent().getParent();
frame.setTitle("Assassin");
frame.setResizable(false);
p = new Player(400, 400); //initialize Player here
this.addKeyListener(p.getHandler());
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.