gpt4 book ai didi

java - 为什么我的 KeyPressed 方法从未被调用过?

转载 作者:行者123 更新时间:2023-11-30 08:39:19 25 4
gpt4 key购买 nike

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

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

最佳答案

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

例如,在 Game 类中,

something.onKeyPress(this) 

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

关于java - 为什么我的 KeyPressed 方法从未被调用过?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36199467/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com