KeyListener无法正常工作

时间:2014-02-28 19:09:37

标签: java swing input keylistener

我正在开发一款游戏,很久以前我用Java编程了所以我忘记了一些事情,比如如何创建一个KeyListener,所以我读了java文档并想出了这个,但玩家没有当我按下其中一个键时移动。

以下是我的代码。

这是Player.java班级(Player.java扩展Entity.java):

(速度= 1)

public void keyPressed(KeyEvent e){
        if(e.getKeyChar() == 'W' | e.getKeyChar() == 'w' | e.getKeyCode() == KeyEvent.VK_UP){
            yPos = -speed;
        }
        if(e.getKeyChar() == 'S' | e.getKeyChar() == 's' | e.getKeyCode() == KeyEvent.VK_DOWN){
            yPos = speed;
        }
        if(e.getKeyChar() == 'A' | e.getKeyChar() == 'a' | e.getKeyCode() == KeyEvent.VK_LEFT){
            xPos = -speed;
        }
        if(e.getKeyChar() == 'D' | e.getKeyChar() == 'd' | e.getKeyCode() == KeyEvent.VK_RIGHT){
            xPos = speed;
        }
    }

    public void keyReleased(KeyEvent e){
        if(e.getKeyChar() == 'W' | e.getKeyChar() == 'w' | e.getKeyCode() == KeyEvent.VK_UP){
            yPos = 0;
        }
        if(e.getKeyChar() == 'S' | e.getKeyChar() == 's' | e.getKeyCode() == KeyEvent.VK_DOWN){
            yPos = 0;
        }
        if(e.getKeyChar() == 'A' | e.getKeyChar() == 'a' | e.getKeyCode() == KeyEvent.VK_RIGHT){
            xPos = 0;
        }
        if(e.getKeyChar() == 'D' | e.getKeyChar() == 'd' | e.getKeyCode() == KeyEvent.VK_LEFT){
            xPos = 0;
        }
    }

这是Entity.java类:

public void move(){
        x += xPos;
        y += yPos;
    }

这是Entities.java类:

KeyAdapter playerAdapter = new KeyAdapter(){
        @Override
        public void keyPressed(KeyEvent e){
            player.keyPressed(e);
        }
        @Override
        public void keyReleased(KeyEvent e){
            player.keyReleased(e);
        }
    };

    public void move(){
        //Player
        player.move();
    }

,这是在Level.java类中(Level.java扩展JComponent):

在Level()方法中:addKeyListener(entities.playerAdapter);

在paintComponent(Graphics g)方法中:

if(entities.player.getState())
 g2d.drawImage(entities.player.getImage(), entities.player.getX(), entities.player.getY(), this);

和int run()方法:entities.move();

那么,我做错了什么?

1 个答案:

答案 0 :(得分:1)

请注意docs for getKeyChar()中的以下内容:

  

KEY_PRESSED和KEY_RELEASED事件不适用于报告   字符输入。因此,此方法返回的值为   保证仅对KEY_TYPED事件有意义。

出于您的目的the official tutorial建议使用key bindings

  

要定义对特定键的特殊反应,请使用键绑定   而不是一个关键的倾听者。