Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java swing keylistener 2d Dash_Java_Swing - Fatal编程技术网

java swing keylistener 2d Dash

java swing keylistener 2d Dash,java,swing,Java,Swing,我想提出一个boulderdash问题,但首先我只是想让玩家移动,他可以移动到任何不是岩石(1)或墙(0)的空间 我的向上和向左的动作都很好,但向右和向下的动作都很糟糕,即使只按一次键,它们也会移动多个空格。这里是一个可视化的例子,如果它有帮助的话,我会发布所有相关的代码,但我猜这个bug在keylister部分 这是我在另一个网站上传的代码 我花了几分钟试图复制粘贴这里的代码,但代码功能,但不是所有的代码被归类为代码,我不允许提交它 以下是指向其他相关类和文件的链接 首先,切勿使用数值

我想提出一个boulderdash问题,但首先我只是想让玩家移动,他可以移动到任何不是岩石(1)或墙(0)的空间

我的向上和向左的动作都很好,但向右和向下的动作都很糟糕,即使只按一次键,它们也会移动多个空格。这里是一个可视化的例子,如果它有帮助的话,我会发布所有相关的代码,但我猜这个bug在keylister部分

这是我在另一个网站上传的代码

我花了几分钟试图复制粘贴这里的代码,但代码功能,但不是所有的代码被归类为代码,我不允许提交它

以下是指向其他相关类和文件的链接


首先,切勿使用数值常量代替字段常量

public void keyPressed(KeyEvent k) {
    int keyCode = k.getKeyCode();           
    if(keyCode == KeyEvent.VK_R) // not keyCode == 82
}
更好的方法是使用InputMap和ActionMap,我认为这也称为“键绑定”(正如MadProgrammer所建议的)。输入映射将按键笔划映射到动作名称,而动作映射将动作名称映射到要执行的动作

替换您的行(以及整个KeyListener扩展类)

有点像

this.getInputMap().put(KeyStroke.getKeyStroke("control L"), "link");
您需要参考
KeyStroke.getKeyStroke
的文档,根据需要修改指定的按键行程。在我的示例中,“link”是按下CTRL+L时要执行的操作的名称。现在我们需要指定“链接的作用”

其中LinkAction是我的类,扩展了
AbstractAction
,在您的情况下,它应该包括您的方法,例如
levelReaderObject.setCurrentLevel(presentLevel)

请注意,不需要为每个键创建操作。对于移动(上、下、左、右),我会将所有的移动按钮绑定到不同的动作名称(“上移”等),然后将所有动作名称映射到同一个动作,并让该动作中的方法完成工作:

this.getActionMap().put("move up", new MoveAction(0));
this.getActionMap().put("move down", new MoveAction(1));
this.getActionMap().put("move right", new MoveAction(2));
this.getActionMap().put("move left", new MoveAction(3));


请注意,我的建议是将移动动作分组在一起,这是一个设计决策,您应该自己决定如何构造绑定(您可以对所有动作使用一个动作,也可以对每个动作使用一个动作).

我的猜测是,
KeyListener
对于关键事件管理来说是一个糟糕的选择,您应该使用。。。
this.getActionMap().put("link", new LinkAction());
this.getActionMap().put("move up", new MoveAction(0));
this.getActionMap().put("move down", new MoveAction(1));
this.getActionMap().put("move right", new MoveAction(2));
this.getActionMap().put("move left", new MoveAction(3));
class MoveAction extends AbstractAction {

    int direction;

    public MoveAction (int direction) {

        this.direction = direction;
    }

    @Override
    public void actionPerformed(ActionEvent e) {

        switch(direction) // perform the action according to the direction
    }
}