0
我正在做一个基于小回合的RPG游戏。对于每一回合,两个角色中的一个尝试在2000ms后击中另一个角色,定时器重新开始攻击方法(给玩家时间以读取每回合的结果)。战斗结束后,玩家会回到水平地图,在那里他可以选择离开或开始另一场战斗。这是我的问题:每当玩家发起一场新的战斗时,计时器延迟越来越短,所以在某个时刻战斗发生得太快。第一次战斗,每回合将是2秒,然后1秒,然后500毫秒,依此类推。这是我的代码,我错过了什么?Java Swing Timer变得越来越快
public void attack(Character a, Character d) {
//Calculations//////////////////////////////////////////////
///////////////////unit a (attacker)////////////////////////
Weapon aWep = (Weapon) a.inventory[0];
double aCritRate = (double) (a.skl/2 + aWep.crit - d.lck)/100;
double aHitRate = (double) (aWep.acc + (a.skl * 2) + (a.lck/2))/100;
double aAvoidRate = (double) (a.spd * 2 + a.lck)/100;
int aAttackPower = (a.pow + aWep.dmg);
boolean aTwice = a.spd >= d.spd + 4 ? true : false;
///////////////////unit d (defender)////////////////////////
Weapon dWep = (Weapon) d.inventory[0];
double dCritRate = (double) (d.skl/2 + dWep.crit - a.lck)/100;
double dHitRate = (double) (dWep.acc + (d.skl * 2) + (d.lck/2))/100;
double dAvoidRate = (double) (d.spd * 2 + d.lck)/100;
int dAttackPower = (d.pow + dWep.dmg);
boolean dTwice = d.spd >= a.spd + 4 ? true : false;
int delay = 2000;
Timer timer;
ActionListener repeat = new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
switch(bturn){
case(1):attack(d,a); break;
default:break;
}
}
};
timer = new Timer(delay,repeat);
//Battle/////////////////////////
int aDmg = aAttackPower - d.def;
double aHitChance = aHitRate - dAvoidRate;
String sound;
//Turn 1
if (aHitChance >= rngs[rngsIndex]) {
if (aCritRate >= rngs[rngsIndex]) {
aDmg *= 3;
sound="crit.wav";
t.print("Critical Hit! " + a.name + " attacks " + d.name + " for " + aDmg + " damage!");
rngsIndex++;
} else {
sound="hit.wav";
t.print(a.name + " attacks " + d.name + " for " + aDmg + " damage!");
rngsIndex++;
}
d.damageHp(aDmg);
rngsIndex++;
} else {
sound = "miss.wav";
t.print(a.name + " has missed.");
rngsIndex++;
}
playSound(sound);
if (d.isDead) {
String add = t.text.getText();
add+=" " + d.name + " has been killed.";
t.print(add);
a.xp+=35;
charPane.set(a);
grid[d.x][d.y].removeMouseListener(grid[d.x][d.y].hover);
killUnit(d, grid[d.x][d.y]);
}
if (d.faction.equals("e")) {
enemPane.set(d);
} else {
charPane.set(d);
}
//Turn 2
bturn++;
if(!d.isDead && bturn==1){
System.out.println("REACHED");
timer.start();
}
else{
timer.stop();
bturn = 0;
grid[d.x][d.y].removeActionListener(grid[d.x][d.y].targetable);
clearGrid();
loop();
}
}
你已经有了将近递归会在这里,这里的攻击方法是创建一个Timer实例,然后调用攻击,然后创建** **另一个定时器实例,这就是所谓的攻击...,我不认为你想这样做。您需要重新思考,然后重新连线此代码。 –
请注意,不管您在哪里停止计时器,所以在此程序运行时您将有许多计时器正在运行。 –
@HovercraftFullOfEels我有一个timer.stop();在最后_else_语句 – Nihilish