簡體   English   中英

添加keylistener返回空指針異常

[英]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方法中創建播放器。

請參閱Applet生命周期:init()和start()與destroy()和stop()之間的實際區別是什么?

嘗試進行以下更改:

  • 使您的Player變量為非靜態。
  • 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.

     
    粵ICP備18138465號  © 2020-2024 STACKOOM.COM