Java 在使用KeyEvent时遇到问题
我的问题是,如何让我的Java 在使用KeyEvent时遇到问题,java,keyevent,gridworld,Java,Keyevent,Gridworld,我的问题是,如何让我的move()方法使用KeyEvents即KeyEvent.VK_DOWN? 我目前正在尝试使用import java.awt.event.KeyEvent其中我将使用箭头键而不是numpad键在二维网格中移动玩家。我有我的动作moveUp()moveRight()moveDown()和moveLeft()在我的超级类User中,类Player扩展User并包含关键事件方法。当我使用箭头键时,参与者不会移动,但是当我在网格中手动单击参与者并选择一个方法时,它会移动。因此,我的
move()
方法使用KeyEvents
即KeyEvent.VK_DOWN
?
我目前正在尝试使用import java.awt.event.KeyEvent代码>其中我将使用箭头键而不是numpad键在二维网格中移动玩家。我有我的动作moveUp()代码>moveRight()代码>moveDown()代码>和moveLeft()代码>在我的超级类User
中,类Player扩展User
并包含关键事件方法。当我使用箭头键时,参与者不会移动,但是当我在网格中手动单击参与者并选择一个方法时,它会移动。因此,我的移动方法可以工作,所以我假设我的KeyEvent设置被破坏。提供了显示我手动控制这些方法的图片
包含移动方法的用户
package info.gridworld.actor;
import info.gridworld.grid.Grid;
import info.gridworld.grid.Location;
public class User extends Actor {
private boolean isStopped = false;
public User()
{
setColor(null);
}
public void moveUp(){
moveTo(getLocation().getAdjacentLocation(Location.NORTH));
}
public void moveDown(){
moveTo(getLocation().getAdjacentLocation(Location.SOUTH));
}
public void moveLeft(){
moveTo(getLocation().getAdjacentLocation(Location.WEST));
}
public void moveRight(){
moveTo(getLocation().getAdjacentLocation(Location.EAST));
}
}
Player类包含关键事件
package game.classes;
import info.gridworld.actor.User;
import java.awt.event.KeyEvent;
public class Player extends User{
public Player(){
}
public void keyPressed(KeyEvent e){
int keys = e.getKeyCode();
if((keys == KeyEvent.VK_UP)){
moveUp();
}
else if((keys == KeyEvent.VK_DOWN)){
moveDown();
}
else if((keys == KeyEvent.VK_LEFT)){
moveLeft();
}
else if((keys == KeyEvent.VK_RIGHT)){
moveRight();
}
}
}
主类
package game.classes;
import info.gridworld.grid.*;
public class PlayerRunner{
private static GameGrid world = new GameGrid();
public static void main(String[] args)
{
Player player = new Player();
world.add(new Location(0, 0), player);
world.show();
}
}
您正在扩展Actor,它与GUI无关,而KeyEvents和相关的是swing。实际上,您需要向JPanel添加一个KeyListener。据我所知,现在在Actor类中只有额外的方法
GUI实际上不在AP测试中,因此没有太多内容,但看起来您可以扩展info.gridworld.GUI.GridPanel。因此,将构造函数重写为:
public GridPanel(DisplayMap map, ResourceBundle res)
{
super(map, res);
addKeyListener(new KeyListener()
{
// Put the KeyListener methods here.
// (All of them: KeyListener is an interface
}
}
这有点粗糙,但我认为应该行得通
我假设您将有一个对Actor的引用,您可以使用箭头键移动它,因此您可以调用它的move方法。世界类实际上有一个keyPressed()方法。您只需扩展World并重写此方法即可。它将为您提供一个要使用的字符串参数,而不是KeyEvent。使用javax.swing.KeyStroke.getKeyStroke(description).getKeyCode()确定按下了哪个键。世界级的源代码是:aster/framework/info/gridworld/World/World.java
至于访问参与者的方法,我会引用世界级的参与者。然后,当您添加要移动到世界的演员时,您可以将其设置在那里。然后,在处理击键时,您可以访问要操纵的参与者 我不认为它是这样工作的,难道World
没有收到关键信息吗?我建议使用keyBinding作为this@MadProgrammer我将尝试这个例子,我也没有在ActorWorld中看到keyPressed方法class@Rod_Algonquin我也这么认为,但OP使用的是gridworld
API,它的工作原理稍有不同……并不是说这不可能,但如果我们能找到与API一起工作的东西,它将产生更好的结果,如果失败……hack,hack,hack;)@用户3709396超级(地图、资源);不符合JPanel方法中的参数,需要我删除map和res………`构造函数JPanel(DisplayMap,ResourceBundle)未定义删除参数以匹配“JPanel()”`我将把move()方法放在哪里?它们无法从gridPanel访问,而将它们移动到grid panel也不起作用,因为我无法访问location Getters您是在扩展gridPanel还是JPanel?整个问题是我不明白您在做什么,您是在修改gridPanel中的构造函数,还是说创建一个单独的类来完成所有这些工作?把它放在player类和user类中?我可以创建所有的KeyEvents等等,我只是不知道该在哪里添加它才能正常工作?抱歉,但我刚刚意识到这是一种糟糕的方式。发布了一个更好的答案…好的,应该可以,但是位置参数的原因是什么?那是演员的位置吗?(getLocation();)?另外,我相信您的一个链接已断开,我无法编辑以前的评论,这就是我创建此新评论的原因。我认为是在World gui中选择的演员。你不应该因为你在做什么而需要它