【发布时间】: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