繁体   English   中英

Java Swing Keylistener 2D Boulderdash

[英]java swing keylistener 2d boulderdash

我正在寻找一个难题,但首先,我只是想让玩家移动,他被允许移动到不是岩石(1)或墙壁(0)的任何空间。

我的上,下动作很好,但是上,下动作都搞砸了,即使只按了一次键,它们也移动了多个空格。 如果有帮助,请使用以下可视化文件,我发布了所有相关代码,但我猜该错误在“按键监听器”部分中

这是我在另一个网站http://textuploader.com/13k1上载的代码

我花了几分钟试图将代码复制粘贴到此处,但是代码功能但并非所有代码都被归类为代码,因此我无法提交它

这是其他相关类和文件的链接

首先,永远不要使用数字常量而不是字段常量,

public void keyPressed(KeyEvent k) {
    int keyCode = k.getKeyCode();           
    if(keyCode == KeyEvent.VK_R) // not keyCode == 82
}

更好的方法是使用InputMap和ActionMap,我认为它们也称为“键绑定”(由MadProgrammer建议)。 输入映射将击键映射到动作名称,而动作映射将动作名称映射到您要执行的动作。

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

this.addKeyListener(new MyKeyListener());

用类似的东西

this.getInputMap().put(KeyStroke.getKeyStroke("control L"), "link");

需要参考KeyStroke.getKeyStroke的文档以根据需要修改指定的击键。 在我的示例中,“链接”是按下CTRL + L时要执行的操作的名称。 现在我们需要指定“链接是什么”

this.getActionMap().put("link", new LinkAction());

其中,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));

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
    }
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM