2010-10-29 37 views
0

我在ActionScript中編寫了一個遊戲,其中我有多個類應該是「可以」通過鏡頭。如何在AS3中爲多個類提供沒有繼承的附加功能?

所有其他遊戲中實體繼承的最通用的類​​是CombatObject; CombatShip,CombatAsteroid和其他類繼承它。 CombatAi和CombatPlayer類都從CombatShip繼承。

現在我想通過鏡頭製作CombatAi,CombatPlayer和CombatAsteroid,但我不希望它們繼承它(稍後可能會有CombatShips應該不可用)。

我現在的想法是讓這三個實現一個Interface,IHitable,以便當它們與鏡頭相撞時,我可以詢問if(hitObject is IHitable),如果屬實,那麼鏡頭就會被破壞並造成傷害。

現在的問題是,這將是最好有每種這些類

  1. 實現所有需要的代碼,以損害(例如檢查護罩,計算損傷百分比等)自身
  2. 的讓他們擁有一個類DamageManager的實例,並實現一個函數getDamageManager():DamageManager,返回一個處理所有傷害相關功能的類
  3. (2)的一個缺點是每個CombatShip,CombatAsteroid等都必須擁有一個DamageManager實例。讓DamageManager成爲一個Singleton並且僅僅提供給船隻和給予它的射擊並讓它處理其餘部分會更好嗎?

回答

1

Mixins是一個好主意,但它在AS3中的支持很好,是模擬的。

選項2將工作,但暴露DamageManager的實例會破壞封裝。您可以通過在IHable界面中添加一個命中方法來解決這個問題。當有東西碰到這個對象時,這個方法會被你的遊戲所調用。這個方法的實現取決於對象。您可以針對每個對象(選項1)以不同的方式實施它,但您也可以創建通用的DamageManager類並使用它來計算損壞。

class DamageManager { 
    public function calculateDamage(...){ 
     // implement your damage logic... 
    } 
} 

interface IHitable { 
    function hit(by:GameObject); 
} 

而對於爲例在康巴普萊爾

class CombatPlayer implements IHitable 
{ 
    private var _damage:DamageManager; 

    public function CombatPlayer(){ 
     _damage = new DamageManager(); 
    } 

    public function hit(by:GameObject):void { 
     _damage.calculateDamage(...); 
    } 
} 

我留在DamageManager開放的,因爲我不知道你的對象是如何實現既要如何計算損害實現。

我覺得理想情況下,DamageManager不應該直接修改你的對象。你可以傳遞一個Stat對象(包含對象的健康和盾牌信息)和另一個描述「擊球者」屬性的對象,DamageManager將返回另一個Stat對象,你可以用它來更新「被攻擊者」的屬性。

希望它能帶來一些感官!

+0

你完全正確的封裝,這看起來很不好,我從來沒有注意到。你關於stat對象的想法很有趣:所以你的想法是你想操作多個「hitee」值但你不想傳遞一個引用給自己(比如直接操作),所以你使用一個stat對象作爲容器來回傳遞信息並保持封裝完好?另一個問題:這是返回多個值時的最佳實踐嗎? – 2010-10-30 14:17:35

+0

是的,這正是它。對於其他問題,我不確定是否有另一種方法返回多個值,而不是返回帶有這些值的對象,至少在AS3中。 – subb 2010-10-30 16:37:25

1

選項1會導致很多重複的代碼,這很明顯的原因。

選項3意味着你所有的碰撞代碼都會進入一個類。從封裝的角度來看,這是不好的,因爲你最終會得到一個處理所有事情的龐然大物。

這使得選項2成爲最佳選項。選項2比選項3更好,因爲您可以爲不同類型的船隻和小行星擴展DamageManager類。

不過,我也想提出一個選項4:混入

混入是一個語言水平的功能,讓您無需繼承通用功能添加到多個類別。雖然ActionScript 3語言不支持mixin,但AS3足夠靈活,可以模擬它。 Mixin or Trait implementation in AS3?

+0

選項3只在打擊檢測後(射擊中)宣稱射門實際已擊中並且對象可擊中後才被調用。然後它會根據某種算法進行傷害計算並將傷害傳遞給命中對象。 – 2010-10-29 23:40:19

0

如何在IHitable接口中實現isHitable getter,如果您希望稍後在遊戲中對某些類進行更改,這可以提供更大的靈活性,因爲IHable實例「IHable」將始終返回true。

根據計算結果類型&產生的修改,DamageManager並不一定是單身人士,你可以調用一個靜態方法來處理損傷評估並返回修改後的對象。

+0

那麼這個想法是隻給那些「合適」的適合的接口,即CombatPlayer,CombatAi,CombatAsteroid;但不是戰鬥艦。有一個靜態方法而不是Singleton的好處是什麼?是不是一個單一的靜態方法與一個實例類? – 2010-10-30 12:42:47

+0

接下來你要說明一些CombatShips可能不適合在遊戲中使用。至於Singleton,並不是真的......單個靜態方法與Singleton類沒有可比性。 – PatrickS 2010-10-30 19:54:54