提问者:小点点

如何使用计时器使用动态计时器执行技能效果?


目前,我正在使用计时器来执行我的技能效果。它将每3秒对所有技能效果进行一次心跳。

这是我的代码:

public class EffectServiceImpl extends AbsServiceAdaptor<EffectConfig> {
    private static EffectServiceImpl instance;
    private FastList<Monster> existsEffectMonsterList;
    private Timer timer;
    public static EffectServiceImpl getInstance() {
        if(null == instance) {
            instance = new EffectServiceImpl();
        }
        return instance;
    }
    private EffectServiceImpl() {
        existsEffectMonsterList = new FastList<Monster>();
        timer = new Timer();
        timer.schedule(new MonsterEffectCheckTask(), 10000, 3000); // Heartbeat every 3 seconds
    }
    public class MonsterEffectCheckTask extends TimerTask {
        @Override
        public void run() {
            if(existsEffectMonsterList.size() > 0) {
                Monster monster;
                Effect effect;
                for(int i = 0; i < existsEffectMonsterList.size();) {
                    monster = existsEffectMonsterList.get(i);
                    if(monster.effectList.size() > 0) {
                        for(int j = 0; j < monster.effectList.size();) {
                            try {
                                effect = monster.effectList.get(j);
                                if(effect.heartbeat(monster)) {
                                    j++;
                                }
                            }
                            catch(Exception e) {
                                e.printStackTrace();
                                break;
                            }
                        }
                    }
                    if(monster.effectList.size() == 0) {
                        existsEffectMonsterList.remove(i);
                    }
                    else {
                        i++;
                    }
                }
            }
        }
    }
}

但是我希望不是所有的技能特效都能做3秒的心跳,会有小于3秒或者大于3秒的心跳技能(即动态周期)。

所以我将timer.附表的句点更改为1:

    ...
        timer.schedule(new MonsterEffectCheckTask(), 10000, 1);
    ...

然后将Thread.睡眠添加到TimerTask:

...
if(monster.effectList.size() > 0) {
    for(int j = 0; j < monster.effectList.size();) {
        try {
            effect = monster.effectList.get(j);
            if(effect.heartbeat(monster)) {
                j++;
            }
            Thread.sleep(effect.execTime); // This is dynamic time, each effect has an `execTime`. Code `public int execTime;`
        }
        catch(InterruptedException e) {
                e.printStackTrace();
        }
        catch(Exception e) {
            e.printStackTrace();
            break;
        }
    }
}
...

如果是上面这样的代码,我应该:使用计划计划或任何其他?有什么解决方案来替换Thread.睡眠以防想要“暂停”定时器?我应该设置延迟周期(我知道如果我设置为0我会得到一个IllegalArgumentException,但如果设置为1太短)?我希望效果在“暂停”时间到期后立即心跳。此外,可以有许多效果相同的心跳,但每个效果的“暂停”时间不一样。

我将感激你的回答。


共0个答案

相关问题