2012-07-22 137 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来适应此操作。