2013-10-22 119 views
2

我正在構建一個簡短的基本遊戲,並且已經給出了一些代碼來查看。遊戲中的所有角色都是遊戲對象,有些是可移動的,有些則不是。可移動的有一個位置和方向。簡介:一些遊戲對象移動,一些不移動

我得到了一個MoveableObject類(如下)。可移動的GameObjects在它們自己的構造函數中實例化這個類。我不能保證這段代碼是正確的,所以我試圖理解它背後的理論。

public class MoveableObject { 
    int speed; 
    String direction; 

    public MoveableObject(){ 
     speed = 0; 
     direction = "unknown"; 
    } 

    public MoveableObject(int iSpeed, String sDirection){ 
     speed = iSpeed; 
     direction = sDirection; 
    } 

和所有可移動的字符在構造函數中創建此類的一個實例。例如,來自吸血鬼班。

public class Vampire 
    public Vampire(){ 
      MoveableObject thisObject = new MoveableObject(30, "South-East"); 
     } 
} 

據我所知,這被稱爲聚合。我認爲這是用於HAS-A關係,而不是IS-A。由於字符IS-A可移動對象,我應該不使用繼承或接口嗎?我也不明白爲什麼你需要創建一個MoveableObject實例,如果每個字符都是或者不是可移動的,當然,你應該給它們移動或不移動的能力(通過繼承或接口),然後實例化人物?

在此先感謝。

+0

吸血鬼類(或其他可移動對象)是否有可能計劃在稍後繼承其他類? (我想這是來自某種課堂作業,對吧?) – Fildor

+0

是的,這是一個班級作業。吸血鬼將從繼承自GameObject的HeadVampire繼承。頭部吸血鬼可以出現和消失,所以它們不是可移動對象,因爲它們沒有速度或方向,只是一個新的位置。 – Killian

+0

你走了。 Java不支持類的多重繼承,這就是爲什麼。 I.e .:你不能「擴展」兩個不同的類。所以如果吸血鬼會擴展HeadVampire,那麼它就無法擴展其他任何東西。 – Fildor

回答

0

這取決於如果MoveableObject類也需要對象的實際運動的護理(即根據speeddirection成員更新其位置)或僅持有speeddirection成員,使該遊戲的引擎模塊會用它來計算對象的位置。

在後一種情況下,我會將MoveableObject類的名稱更改爲更合適的內容並堅持聚合。否則繼承將更適合可移動的對象。這樣移動的邏輯將被執行一次,而子類可以只照顧自己的特定需求。

爲了進一步解釋,如果MoveableObject只不過是你能創建一個接口的數據容器:

public Interface Moveable { 
    public MoveableObject getMovementData(); 
} 

和每個移動類將是這樣的:

public class Vampire implements Moveable { 
    . 
    . 
    private MoveableObject movementData; // 
    . 
    . 
    public MoveableObject getMovementData() { 
     return movementData; 
    } 
} 

,並在你的遊戲引擎舉行所有移動物體(可移動類型)的數組以及更新方法獲取移動數據並對其進行處理:

public Class GameEngine { 
    . 
    . 
    private ArrayList<Moveable> movableObjects = ..... 
    . 
    . 

    public void gameUpdate() { 
     for (Moveable moveableObj : movableObjects) { 
      MoveableObject movementData = moveableObj.getMovementData(); 
      // Process and update as required using the given data 
     } 
} 
+0

不,MoveableObject不關心實際的運動,它只是保持速度和方向。感謝您的解釋,我認爲一個界面可能會更好。 我仍然不明白爲什麼你會堅持聚合如果MoveableObject計算出新的位置。在接口中保留接口和例如calcualteNewPosition()是沒有意義的嗎? – Killian

+0

因爲如果MoveableObject只保存數據並且不對它執行任何邏輯,那麼它只是一個數據容器,並且更優雅地存儲在與其相關的類中(因爲它只有兩個成員,您並不需要它但對許多成員來說,這將更容易管理) – giorashc

+0

您當然也可以使用這些成員創建一個Moveable類,而吸血鬼類可以繼承此類並使用其成員,但是如果您有更多的成員,則這很容易出現多重繼承您的世界實體共享的課程類型 – giorashc