2012-09-26 67 views
2

在我的遊戲中,當按下鼠標右鍵時,你會將一個物體放置在地面上。所有對象都有相同的超類(GameObject)。 我有一個名爲selected的字段,每次都等於一個特定的gameobject。 單擊鼠標右鍵時,它會檢查選定的實例以及它如何確定將哪個對象放置在地面上。代碼exapmle: t是對象將要去的「槽」。滾動物體然後創建這個物體的新實例

if (selected instanceof MapleTree) { 
    t = new MapleTree(game,highLight); 
} else if (selected instanceof OakTree) { 
     t = new OakTree(game,highLight); 
} 

現在它必須是對象的「新」實例。最終,我的遊戲將擁有數百個GameObjects,並且我不想擁有巨大的if else語句。我將如何製作它,以便它可以滾動查看可能的對象類型,如果它的類型正確,則創建它的新實例...?

按E時,它將切換所選的類型,並且也是if語句。我該怎麼做呢?這裏是一個代碼示例:

if (selected instanceof MapleTree) { 
     selected = new OakTree(game); 
} else if (selected instanceof OakTree) { 
    selected = new MapleTree(game); 
} 
+0

試圖重塑我的世界是我們:) – sircapsalot

+0

我喜歡每一個崗位在這裏開始使用Java和遊戲人做怎麼也說這個東西,沒準兒而不是做你能有所幫助。 – MxR

回答

0

我不太瞭解Java的,但建議你至少貿易方式在您很長的if-else樹好可讀性和可能更快switch statement

+1

您不能在switch語句中使用instanceof。 – MxR

2

這聽起來像你會很好地使用Prototype

OR

,如果你想堅持使用顯式路由你可以使用工廠方法(S)的一個HashMap。

OR

如果你想要去的隱性和AUTOMAGIC你可以使用反射來的類實例的操作和檢索的構造,然後將其稱爲:http://docs.oracle.com/javase/tutorial/reflect/member/ctorInstance.html

OR

的混合上面的一些方法是確保每個類都實現了一個靜態(或不)工廠方法,如getInstance(),然後當你有匹配的對象時,你可以直接在該對象上調用該工廠方法(或它是保持靜態靜態的類)。這有點自動但仍然更容易遵循。

+0

但是,當使用原型時,我將如何滾動儘管可能的對象? – MxR

+0

你可以克隆現有的選擇,不需要條件。 'selected'成爲原型。 –

+0

似乎工作的第一個問題,但我不能看到我會怎麼做的第二個。 – MxR

0

這是一個使用反射的例子。它假定按照慣例你在你所有的GameObject子類中都有相同的構造函數簽名。

如果您想「滾動瀏覽所有對象列表」,則必須自己維護一組所有不同的類。然後你可以使用相同的方法構建一個新的克隆和現有的克隆。

import java.lang.reflect.Constructor; 
import java.lang.reflect.InvocationTargetException; 
public class GameTest { 

public static class Game { 
    // TODO 
} 
public static abstract class GameObject { 
    protected GameObject(Game game) { 
     // TODO 
    } 
} 

public static class MapleTree extends GameObject { 
    // Copy constructor 
    public MapleTree(MapleTree tree, Game game) { 
     super(game); 
     // TODO, copy 
    } 
} 

public <T extends GameObject> T buildNew(Class<T> clazz, Game game) { 
    try { 
     final Constructor<T> constructor = clazz.getConstructor(Game.class); 
     return constructor.newInstance(game); 
    } 
    catch (NoSuchMethodException | SecurityException 
     | InstantiationException | IllegalAccessException 
     | IllegalArgumentException | InvocationTargetException e) { 
     e.printStackTrace(); 
    } 
    return null; 
} 

public GameObject cloneSelected(GameObject selected, Game game) { 
    return buildNew(selected.getClass(), game); 
} 
}