0

我的问题是,我怎样才能让我的move()方法使用KeyEventsie KeyEvent.VK_DOWN?我目前正在尝试使用import java.awt.event.KeyEvent;我将使用箭头键而不是数字键盘键在二维网格中移动玩家。我有我的动作moveUp(); moveRight(); moveDown();moveLeft();在我的超类User和类Player extends 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 类包含 KeyEvents

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();
  }
}  

预移动

moveDown() 选中

4

2 回答 2

1

您正在扩展 Actor,这与 GUI 无关,而 KeyEvents 和相关是一个摇摆的东西。您实际上需要将 KeyListener 添加到 JPanel。据我所知,现在你只在 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 的引用,无论如何您都可以使用箭头键移动它,因此您可以调用它的移动方法。

于 2014-06-10T02:54:23.453 回答
0

World 类实际上有一个 keyPressed() 方法。您可以扩展 World 并覆盖此方法。它会给你一个字符串参数而不是 KeyEvent。使用 javax.swing.KeyStroke.getKeyStroke(description).getKeyCode() 找出按下了哪个键。World类的来源是她: https ://github.com/parkr/GridWorld/blob https://github.com/parkr/GridWorld/blob/master/framework/info/gridworld/world/World.java aster /framework/info/gridworld/world/World.java

至于访问您的 Actor 的方法,我会在 World 类中引用一个 Actor。然后,当您添加要移动到世界的 Actor 时,您可以将其设置在那里。然后,当您处理击键时,您可以访问要操作的 Actor。

于 2014-06-11T04:57:35.633 回答