我正在尝试编写我的第一个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()方法?
答案 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: ");
}