我尝试了一些游戏机制,我试图模仿WoW的周期性事件,例如“每z秒造成x次伤害”。到目前为止,我已经使用了Timers来安排定期任务,在这种情况下,我正在尝试重新生成健康,但是为了修改实例变量_mana,是否真的有必要传递“this”?我是否真的需要一个单独的TimerTask类来“每z秒重新生成x个健康状况”?
在C#中,我知道只需创建一个通过方法处理滴答的计时器,我就能做到这一点。我如何用Java做到这一点?或者这段代码是否合适(高效)?
private int _mana;
public void regenerate(int amount, int rate)
{
_regenerator = new Timer();
_regenerator.scheduleAtFixedRate(new regenerator(this, amount), 0, rate*1000);
}
public class regenerator extends TimerTask
{
private ManaResource _mr;
private int _amount = 0;
public regenerator(ManaResource mr, int amount)
{
_mr = mr;
_amount = amount;
}
public void run()
{
_mr._mana += _amount;
System.out.println(_mr._mana);
}
}
答案 0 :(得分:1)
如果regenerator
是ManaResource
的内部类,那么您不需要将this
作为参数传递。内部类具有对外部类“this
。
要访问this
,您需要在前面添加外部类名称:
public void run() {
ManaResource.this._mana += _amount;
}
因为regenerate
实例也有自己的this
。
我希望这是有道理的。这里有很多'那里。
你需要一个新的TimerTask类来“每y秒重新生成x”;没有轻量级的方法来传递Java中的函数。
答案 1 :(得分:1)
这种方式通常适用于大多数MMO游戏,有一种“脉冲”。每隔X秒,就会发生所有周期性的事情。出于某种原因,我认为在Everquest 2中它是6秒,在WOW中是2秒,但是自从我详细研究这些东西以来已经很长时间了:)
你在游戏循环中想要的是某种检查“是时候做周期性的事了”。你希望在你的“滴答”长度过后尽快发生。如果你决定每秒做一次“滴答”,那么你在1.0秒和1.1秒之间做你的东西并不重要。
我会谨慎地在计时器或单独的线程中执行此操作,因为您需要处理各种同步问题。将核心逻辑保存在一个线程中。如果性能问题,您可以在以后的更多线程中添加花哨的东西。