【问题标题】:Why is my KeyPressed method never called?为什么我的 KeyPressed 方法从未被调用?
【发布时间】:2016-03-24 11:49:00
【问题描述】:

我正在尝试编写我的第一个 PacMan 游戏。所以我按照指南创建了一个小型游戏引擎,现在我正在 PacMan.java 文件中编写代码,该文件将游戏引擎作为一个包包含在内。问题是,指南指示您覆盖 KeyPressed 方法,但是当我这样做时,什么都没有发生。屏幕上的 PacMan 应该根据我根据 KeyPressed() 方法按下的箭头键来改变它的方向,但是当我按下箭头键时没有任何反应。即使我有它的代码,我也无法通过箭头键控制小吃豆人!

我什至放了一个简单的 System.out.println(); KeyPressed() 方法中的语句以查看 KeyPressed() 方法是否被实际调用过,但它似乎从未被调用过?当我按下箭头键时,“按下键”没有被打印出来,当我按下它们时,PacMan 也没有移动。谁能理解为什么我按下箭头键时不会调用我的 KeyPressed 方法?

我的代码:

package game.pacman;

import org.game.engine.Game;
import org.game.engine.GameApplication;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

public class PacMan extends Game {

    public static void main(String[] args){

        GameApplication.start(new PacMan());

    }

    BufferedImage pacman;
    int frame;
    int dir;
    int x, y;
    final int STEP = 2;

    public PacMan(){
        title = "PacMan";
        frame = 0;
        dir = KeyEvent.VK_RIGHT;
        x = 300;
        y = 200;
        width = height = 400;

        try {
            pacman = ImageIO.read(new File("images/packman.png"));
        } catch (IOException e) {
            e.printStackTrace();
        }


    }

    @Override
    public void keyPressed(KeyEvent e){

        System.out.println("pressed the key");
        dir = e.getKeyCode();
    }

    @Override
    public void update(){
        frame++;

        if (frame > 2){
            frame = 0;
        }
        switch (dir){
            case KeyEvent.VK_LEFT:
                x -= STEP;
                break;
            case KeyEvent.VK_RIGHT:
                x += STEP;
                break;
            case KeyEvent.VK_UP:
                y -= STEP;
                break;
            case KeyEvent.VK_DOWN:
                y += STEP;
        }
        if ( x < 0){
            x = 0;
        } else if (x > width-28-STEP){
            x = width-28-STEP;
        }
    }

    @Override
    public void draw(Graphics2D g) {
        g.drawImage(pacman.getSubimage(frame*30,(dir-37)*30,28,28), x, y, null);
    }
}

显然,它应该(通过包)覆盖游戏引擎内的 Game.java 类中的 KeyPressed 方法,该方法实现了 KeyListener、MouseListener、MouseMotionListener。这是该类的完整代码:

package org.game.engine;


import java.awt.*;
import java.awt.event.*;

public abstract class Game implements KeyListener, MouseListener, MouseMotionListener{

    protected boolean over;
    protected int delay = 30;
    protected int width = 400;
    protected int height = 400;
    protected String title = "MyGame";


    public String getTitle(){
        return title;
    }
    public long getDelay(){
        return delay;
    }

    public int getWidth(){
        return width;
    }
    public int getHeight(){
        return height;
    }

    public void init(){}
    abstract public void update();
    abstract public void draw(Graphics2D g);

    public boolean isOver(){
        return over;
    }



    public void keyTyped(KeyEvent e) {

    }


    public void keyPressed(KeyEvent e) {

    }


    public void keyReleased(KeyEvent e) {

    }


    public void mouseClicked(MouseEvent e) {

    }


    public void mousePressed(MouseEvent e) {

    }


    public void mouseReleased(MouseEvent e) {

    }


    public void mouseEntered(MouseEvent e) {

    }


    public void mouseExited(MouseEvent e) {

    }


    public void mouseDragged(MouseEvent e) {

    }


    public void mouseMoved(MouseEvent e) {

    }
}

所以你可以看到 KeyPressed() 方法在类中只是空的,这就是指南指示它的方式。我在 PacMan 类(我的主类)中覆盖它。那么为什么箭头键都不起作用,为什么在我运行程序时甚至根本没有调用 KeyPressed 方法?调用 KeyPressed() 方法是否缺少某些内容?

【问题讨论】:

    标签: java


    【解决方案1】:

    虽然您在 Game 类中实现了处理程序并在子类中对其进行了覆盖,但您还没有将处理程序注册到您想要的元素。

    例如,在 Game 类中,

    something.onKeyPress(this) 
    
    // where this is Game class which is of type KeyListener, MouseListener, MouseMotionListener
    

    【讨论】:

    • 对不起,我不明白。你是说我应该在 Game 类的 KeyPressed 方法中添加“something.onKeyPress(this)”吗?或者我应该改变什么才能让它工作?
    • @OfeliavanAnalhard 你想在哪个元素上检测按键?
    • 这里的元素是什么意思?对不起,我是一个初学者,但我不明白你所说的“元素”是什么意思......
    【解决方案2】:

    您必须使用Key-Listener 注册组件,这样做也是如此,

    如果你的组件是 JTextField 那么它应该也是,

    JTextField  typingArea = new JTextField(20);
    typingArea.addKeyListener(this);
    

    在里面按键的时候,typingArea - JTextField也会调用这个方法,

    public void keyPressed(KeyEvent e) {
            displayInfo(e, "KEY PRESSED: ");
        }
    

    【讨论】:

      猜你喜欢
      • 2011-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-15
      • 1970-01-01
      • 2017-12-07
      • 2019-07-03
      • 1970-01-01
      相关资源
      最近更新 更多