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);
(...)

後で各タイルタイプのパラメータまたは動作を追加する必要がある場合、列挙型はこれに対応するのに大いに役立ちます。

于 2012-07-22T08:33:28.550 に答える
0

それは、その型情報で何をしたいかによって異なります。コンパイル時にそのタイプが何であるかを知らなくても、指定されたタイプの新しいオブジェクトを作成したいようです。これは、次のようなメソッドに型情報を追加するために使用できる Java Generics を意味します。

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

あなたは書くことができないので、うまくいきませんnew T()。(Java コンパイラは、実行前に一般的な情報を消去します)。

そのため、Reflection を Generics と組み合わせて使用​​することができます。その場合、Class オブジェクトをメソッドに渡し、Java の Reflection ユーティリティを使用して、指定したクラスのコンストラクターを見つけることができます。

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

コンストラクタでリフレクションを使用する方法の詳細については、こちらこちらを参照してください。

あるいは、リフレクションの脆弱性を危険にさらしたくない場合は、Factory パターンを使用し、メソッドに Factory を渡して適切なタイルを構築できます。

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

これを行うには、Tileすべてのタイル タイプが実装するインターフェイスTileFactoryと、各コンクリート タイル ファクトリ (つまり、StoneTileFactory) が実装するインターフェイスが必要です。その後、メソッドを呼び出すときに、StoneTiles を作成する場合は、StoneTileFactory (TileFactory パラメーターの型に適合) を指定できます。

もちろん、インターフェイスを使用したくない場合は、これでも Generics でパラメーター化できます。

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

この場合、 などのTileFactoryimplementの各インスタンスを作成し、ファクトリの getInstance メソッドを適切にパラメータ化する必要があります ( )。TileFactory<TileType>TileFactory<StoneTile>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 に答える