当前位置: 首页 > 知识库问答 >
问题:

当射击不断重复,每次击键都更快时

蒯安平
2023-03-14

好的,所以我要试着解释一下,我在一个包含我的蓝贝和所有构造函数的类中创建了一个射击方法,问题是当我按下空间时,它会不断地射击,而我不会再按下它,如果我按下它两倍的速度,它会以两倍的速度发射,并且它开始在我的网格上包含多个x和y位置我只希望法术在发射时发射,我只需要一个项目,因为我不想在网格上有多个它的实例我希望它是玩家在法术离开网格之前不能发射,这是我的代码,谢谢我只有它调用我的密钥释放看到它应该只做一次密钥已被释放,但如果应该改变,请让我知道谢谢:)

   public void shootSpell(){
    final BlueSpell b = new BlueSpell(GoodGuy.getx(), GoodGuy.gety() +1, BlueSpellWizard());
    int delay = 100;

    ActionListener taskPerformed = new ActionListener(){
        public void actionPerformed(ActionEvent e){


            if(b.gety() != 19){

                WizardCells[b.getx()][b.gety()].setIcon(null);
                WizardCells[b.getx()][b.changey(b.gety()+1)].setIcon(b.getIcon());

            }

            else{
                WizardCells[b.getx()][b.gety()].setIcon(null);
                b.changex(GoodGuy.getx());
                b.changey(GoodGuy.gety() +1);


            }

        }
    };

    new Timer(delay, taskPerformed).start();



    else if(key == KeyEvent.VK_SPACE){


            GoodSpell.shootSpell();


            }

共有2个答案

阴迪
2023-03-14

您还需要在shot()方法中启动新法术之前检查法术当前是否处于视图/激活状态...

public void shootSpell(){
     //do a check here if a spell is already running!
    final BlueSpell b = new BlueSpell(GoodGuy.getx(), GoodGuy.gety() +1, BlueSpellWizard());
    int delay = 100;
 //......

因此,在您更新屏幕上的拼写的方法中,如果它仍然处于活动状态,则需要在其中包含一个标志,或者如果您在新线程中运行它,请将该线程保存到全局var并检查是否线程在实例化新的BlueSpell()之前正在运行

纪畅
2023-03-14

不要使用计时器!您的任务不应每100毫秒重复一次。如果我理解您的代码,您应该在新线程中从您的ActionListener运行代码。

// Something like this,
new Thread(new Runnable() {
    public void run() {
        if (b.gety() != 19) {
            WizardCells[b.getx()][b.gety()].setIcon(null);
            WizardCells[b.getx()][b.changey(b.gety() + 1)].setIcon(b
                    .getIcon());
        } else {
            WizardCells[b.getx()][b.gety()].setIcon(null);
            b.changex(GoodGuy.getx());
            b.changey(GoodGuy.gety() + 1);
        }
    }
}).start();
 类似资料:
  • 我正在尝试在React中构建我的第一个计算器。我的纽扣似乎有问题(我想)。在测试s时,我发现我第一次点击添加按钮不会更新所有setState。相反,第二次单击会正确更新它。 知道它为什么不起作用吗? 我有一个名为“DaInserting”的div,当用户点击任何数字键时会更新,然后当用户点击加法/减法/等时,应该更新,但它没有。它在第二次点击时更新:-检查。 当用户点击加法/减法后,DaInser

  • 为什么第一次点击时状态没有改变? 控制台日志总是在第一次单击时返回“0”,而不是预期的“1”。我该怎么解决这个问题?

  • 问题内容: 我必须在鼠标移动时画线,单击鼠标后,应该继续画线,直到双击为止。说点A,点B和点C。在点A上单击鼠标时,应开始画线。当在B点上单击鼠标时,除非双击,否则上一条线应该与新线一起从B点开始绘制。C点应相同,依此类推,直到双击鼠标为止。经过研究,我编写了下面的代码,它工作得很好,但是它可以用于拖动NOT MOUSE MOVE事件,我试图将代码转移到mouseMoved事件,但是上一行消失了。

  • 在这个图像中有8个按钮。现在我在这个应用程序上使用测试广告单元。这个活动我有8个按钮,每个按钮都与有针对性的活动相联系。我的问题是,当我单击这8个按钮中的任何按钮时,它会显示admob插播广告并发送到目标活动,但当我关闭目标活动并再次返回main_activity并单击这8个按钮中的任何按钮时,admo插播广告不会显示,但在按钮上单击它会打开目标活动。我想在每次点击按钮时显示广告插播广告。这是怎么

  • 嗨,我一直在尝试只获得一个引导日期选择器的日期,并且已经能够,但它似乎激发了3次。注意:这不是jquery日期选择器,而是引导日期选择器。 使用此日期选择器:https://github.com/eternicode/bootstrap-datepicker,而不是老的eyecon。一号。 HTML: 除了改变,我还使用了其他一些选项,比如 但这并没有结束日期选择器,希望有一个简单的解决方案。谢谢

  • 我有以下GridView: 我的目标是在单击创建复选框时自动和读取复选框。因此,我能够创建以下脚本: 您可能想知道为什么我使用了两次。这是因为如果您在复选框上应用css类,ASP. net将在复选框周围包装一个。 因此,如果我打开包含脚本的页面并单击“创建”-复选框,“读取”-复选框也会被选中,并且将被禁用。取消选中“创建”-复选框也可以正常工作:“读取”-复选框将并。 但是:一旦我手动检查了一次