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