当射击不断重复并且每次击键都会更快

时间:2014-04-01 14:18:28

标签: java timer keyboard key imageicon

好的,所以我试着解释一下,我在一个包含我的蓝调的类中创建了一个拍摄方法,以及所有它的构造函数,问题是当我按空格一次它不停地射击而没有我再次按下它,如果我按两次它发射双倍的速度它开始在我的网格上包含多个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 个答案:

答案 0 :(得分:0)

不要使用Timer!您的任务不应每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();

答案 1 :(得分:0)

在射击()方法中启动新法术之前,您还需要检查该法术当前是否处于查看/激活状态......

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;
 //......

所以在你正在更新屏幕上的法术的方法中,如果它仍处于活动状态,你需要在那里有一个标志,或者如果你在一个新线程中运行它,将该线程保存到全局变量并检查在实例化新的BlueSpell()

之前查看线程是否正在运行