2010-10-20 90 views
2

我嘗試了幾個遊戲機制,並且試圖模仿WoW的週期性事件,比如「每隔z秒x損壞」。在這種情況下,我已經使用了定時器來安排定期任務,在這種情況下,我試圖重新生成健康狀況,但確實需要通過「this」來修改實例變量_mana?我真的需要一個單獨的TimerTask類來「每隔z秒重新生成x健康狀況」嗎?重構Java週期性任務

在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); 
    } 
} 

回答

1

如果regenerator是一個內部類ManaResource那麼你就需要通過this作爲參數。內部類具有對外部類'this的隱式引用。

要訪問this,但是,你需要與外部類名的前綴是:

public void run() { 
    ManaResource.this._mana += _amount; 
} 

因爲regenerate實例都有自己的this爲好。

我希望這是有道理的。這裏有很多。

您需要一個新的TimerTask類來「每y秒重新生成一次」;在Java中沒有輕量級的方式來傳遞函數。

+0

我沒有意識到你可以從內部類訪問「this」,因爲在我啓動Java之前,我從未讀過關於類內部的類。 – 2010-10-20 01:01:18

1

這種方式通常適用於大多數MMO,有某種「脈衝」。每隔X秒,所有周期性的事情都會發生。出於某種原因,我認爲它在無盡的任務2中是6秒,而在WOW中是2秒,但是從我仔細研究這些東西開始已經很長時間了:)

你想在遊戲循環中做什麼,是一種檢查「是時候做定期的東西了」。你希望在你的「tick」長度過後儘快發生,如果你決定每秒鐘做一次「tick」,那麼在1.0秒和1.1秒之間做你的東西並不重要,

我會在計時器或單獨的線程中執行它,因爲你需要處理各種同步問題。將核心邏輯保存在單個線程中。如果性能是一個線程,可以在更多線程中添加花哨的東西問題