为什么我的KeyPressed方法永远不会被调用?

时间:2016-03-24 11:49:01

标签: java

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

我甚至把一个简单的System.out.println(); KeyPressed()方法内部的语句,看看KeyPressed()方法是否真的被实际调用过,但它似乎从来没有被调用过? "按下键#34;当我按下箭头键时,没有打印出来,当我按下它们时,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()方法?

2 个答案:

答案 0 :(得分:1)

虽然你在Game类中实现了处理程序并将它们放在子类中,但你还没有将处理程序注册到你想要的元素。

对于前者,在Game类中,

something.onKeyPress(this) 

// where this is Game class which is of type KeyListener, MouseListener, MouseMotionListener

答案 1 :(得分:1)

您必须为此Key-Listener注册组件,

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

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

按住内部键,typingArea - JTextField它也会调用此方法,

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