2012-07-22 133 views
1

我目前正在使用slick2D在java中進行遊戲。遊戲是基於瓦片的,我正在嘗試製作隨機地圖。我正在生成一個房間和一個連接到該房間的走廊,並繼續這樣做直到地圖全部填滿。我有方法如如何將類型的對象傳遞給類?

generateRoom(int x, int y, int width, int height) 

我的問題是如何通過我想在房間中使用瓷磚的類型。我認爲它可能看起來像這樣

generateRoom(StoneTile, int x, int y, int width, int height) 

顯然這是行不通的。我不想發送已創建的實際圖塊,因爲每個圖塊都有一個特定位置,並且在調用方法時我不知道圖塊的位置。我將如何發送在該方法中使用的類型?

回答

0

你可能只是想送Class所以用這樣的:

generateRoom(Class tileClass, int x, int y, int width, int height) 

然後你就可以使用getClass()方法在對象上調用它。

+0

如果您使用的是Java 5,您可以使用Class <?擴展StoneTitle>以進一步限制參數爲特定類型(或子類型) – MadProgrammer 2012-07-22 06:58:56

+0

或者,對於這種情況比'getClass()'''StoneTile.class'更適合。 – Dolda2000 2012-07-22 07:01:29

0

這取決於你想用這種類型的信息做什麼。這聽起來像你想創建給定類型的新對象,而不知道編譯時該類型是什麼。這意味着Java的泛型,它可以用來類型信息添加到像這樣的方法:

<T> generateRoom(int x, int y, int width, int height) 

是行不通的,因爲你不能寫new T()。 (Java編譯器在運行前擦除通用信息)。

所以,你可以嘗試使用反射結合泛型,在這種情況下,你可以在一個類的對象傳遞給你的方法和使用Java的反射工具來找到你給它的類的構造函數。

<T> generateRoom(Class<T> tileClass, int x, int y, int width, int height) { 
    Constructor<T> constructor = tileClass.getDeclaredConstructor(Arg1Type.class, Arg2Type.class); 
    T tile = constructor.newInstance(arg1, arg2); 
} 

here見和here的更多信息,使用反射與構造。

或者,如果你不想冒險反射的脆弱性,你可以使用工廠模式,並通過你的方法一廠,構建合適的瓷磚:

generateRoom(TileFactory tileFactory, int x, int y, int width, int height) { 
    Tile myTile = tileFactory.getInstance(); 
} 

爲了做到這一點,你需要有一個接口Tile您所有的瓷磚類型的實現和接口TileFactory每個混凝土瓦廠(即StoneTileFactory)實現。然後當你調用方法時,如果你想要它創建StoneTiles,你可以給它一個StoneTileFactory(它適合TileFactory參數類型)。

當然,即使這可以用泛型參數,如果你不想使用接口:

<T> generateRoom(TileFactory<T> tileFactory, int x, int y, int width, int height) { 
    T tile = tileFactory.getInstance() 
} 

在這種情況下,您需要做的TileFactory每個實例實現TileFactory<TileType>,如TileFactory<StoneTile>,並適當地參數化工廠的getInstance方法(public T getInstance())。

0

我覺得適合你的方法簡單的方法是創建一個代表瓷磚類型的枚舉:

public enum TileType { 
    STONE, 
    WATER, 
    FIRE, 
    GRASS 
} 

然後你可以通過你的方法傳遞的類型,像這樣:

TileType type = TileType.STONE; 
generateRoom(type, x, y, width, height); 
(...) 

如果您以後需要爲每個tile類型添加參數或行爲,則可以使用a long way來適應此操作。