1

我目前正在使用 slick2D 在 java 中制作游戏。游戏是基于瓷砖的,我正在尝试生成随机地图。我正在生成一个房间和连接到那个房间的走廊,并继续这样做,直到地图全部填满。我有诸如

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

我的问题是如何传递我想在房间中使用的瓷砖类型。我认为它可能看起来像这样

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

显然这是行不通的。我不想发送已经创建的实际图块,因为每个图块中都有一个特定的位置,并且在调用该方法时我不知道图块的位置。我将如何发送要在方法中使用的类型?

4

3 回答 3

0

我认为满足您需求的一种简单方法是创建一个表示图块类型的枚举:

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

然后,您可以通过您的方法传递类型,如下所示:

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

如果您以后需要为每个 tile 类型枚举添加参数或行为,则需要很长的路要走才能适应这一点。

于 2012-07-22T08:33:28.550 回答
0

这完全取决于您想对该类型信息做什么。听起来您想在编译时不知道该类型是什么的情况下创建给定类型的新对象。这意味着 Java 泛型,可用于向方法添加类型信息,如下所示:

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

行不通,因为你不能写new T(). (Java 编译器会在运行前擦除通用信息)。

因此,您可以尝试将反射与泛型结合使用,在这种情况下,您可以将 Class 对象传递给您的方法,并使用 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);
}

有关在构造函数中使用反射的更多信息,请参见此处此处。

或者,如果您不想冒反射的脆弱性的风险,您可以使用工厂模式并将您的方法传递给工厂以构造适当的 Tile:

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()
}

在这种情况下,您需要制作每个实例TileFactoryimplement TileFactory<TileType>,例如TileFactory<StoneTile>,并适当地参数化工厂的 getInstance 方法(public T getInstance())。

于 2012-07-22T07:06:52.303 回答
0

您可能只想发送Class这样的内容:

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

然后您可以使用getClass()对象上的方法调用它。

于 2012-07-22T06:46:46.153 回答