2

In my game when pressing the right mouse button you will place an object on the ground. all objects have the same super class (GameObject). I have a field called selected and will be equal to one certain gameobject at a time. when clicking the right mouse button it checks whats the instance of selected and that how it determines which object to place on the ground. code exapmle: t is the "slot" for which the object will go to.

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

Now it has to be a "new" instance of the object. Eventually my game will have hundreds of GameObjects and I don't want to have a huge if else statement. How would I make it so it scrolls though the possible kinds of objects and if its the correct type then create a new instance of it...?

When pressing E it will switch the type of selected and is an if else statement as well. How would I do it for this too? here is a code example:

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

3 に答える 3

2

Prototypeをうまく使用できるようです。

また

明示的なルートに固執する場合は、ファクトリ メソッドの HashMap を使用できます。

また

暗黙的かつ自動化したい場合は、リフレクションを使用してインスタンスのクラスを操作し、呼び出されるコンストラクターを取得できます: http://docs.oracle.com/javase/tutorial/reflect/member/ctorInstance.html

また

上記のアプローチのいくつかのハイブリッドは、各クラスが次のような静的な(またはそうでない)ファクトリメソッドも実装していることを確認することgetInstance()です。次に、一致するオブジェクトがある場合、そのオブジェクトで直接そのファクトリメソッドを呼び出すことができます(またはそのクラスで static static を維持します)。これはいくぶん自動化されていますが、従う方が簡単です。

于 2012-09-26T22:57:49.087 に答える
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 );
}
}
于 2012-09-26T23:30:34.603 に答える
0

私はJavaについてほとんど知りませんが、少なくとも非常に長いif-elseツリーを交換して、読みやすく、おそらくより高速なswitch ステートメントを使用することをお勧めします。

于 2012-09-26T22:56:20.763 に答える