2017-08-08 107 views
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(); 
    } 


} 
+1

你已经有了将近递归会在这里,这里的攻击方法是创建一个Timer实例,然后调用攻击,然后创建** **另一个定时器实例,这就是所谓的攻击...,我不认为你想这样做。您需要重新思考,然后重新连线此代码。 –

+0

请注意,不管您在哪里停止计时器,所以在此程序运行时您将有许多计时器正在运行。 –

+0

@HovercraftFullOfEels我有一个timer.stop();在最后_else_语句 – Nihilish

回答

0

尝试记录哪个ActionListener重复实例导致了攻击。我想你会看到,加速是由于有更多的Timer和ActionListener实例,然后你想要的。

每次运行后,这些实例的数量会翻倍,因此每秒转数的指数级增长。

在无记录的:

public void actionPerformed(ActionEvent e) 
    { 
     System.out.println("" + LocalDateTime.now() + " " + this); 
     switch(bturn){