0

我一直在用 Java 开发一个关卡阅读器,它可以从我的游戏的 XML 文档中提取关卡数据。一切都很顺利,但是我遇到了一个问题。我从文档中提取的一件事是要创建的游戏对象的 ID。我有一堆类,如墙、播放器和硬币,它们都扩展了一个 GameObject 类。我想在 GameObject 类中有一个基于 ID 返回 GameObject 的方法。像这样的东西:

public GameObject CreateGameObject(int id, int x, int y, GameScreen parent) {
    Type type = getTypeFromList(id);
    Type gobj = new Type(x,y,parent);
    return gobj;
}

我知道我可以使用一堆 if 语句检查 ID 并返回正确的语句来做到这一点,但我希望代码更干净、更通用。如果你能帮助告诉我如何做到这一点,或者告诉我另一种方式,我将不胜感激。

4

1 回答 1

1

我建议使用工厂接口进行GameObject创建,每种类型都有一个实现(如评论中提到的 arynaq):

interface GameObjectFactory {
    GameObject create(); // this could also take arguments like x, y, and parent
}

private static final Map<Integer, GameObjectFactory> FACTORIES_BY_ID;
static {
    final Map<Integer, GameObjectFactory> factoriesById = new HashMap<>();

    // ID 42 is for walls
    factoriesById.put(42, new GameObjectFactory() {
        @Override
        public GameObject create() {
            return new Wall();
        }
    });

    //etc.

    FACTORIES_BY_ID = factoriesById;
}

如果 ID 是连续的,您也可以使用数组:

private static final GameObjectFactory[] FACTORIES = {
    // ID 0 is for walls
    new GameObjectFactory() {
        @Override
        public GameObject create() {
            return new Wall();
        }
    }
};

枚举也可以工作:

enum GameObjectFactory {

    WALL(42) {
        @Override
        GameObject create() {
            return new Wall();
        }
    };

    private final int id;

    private GameObjectFactory(int id) {
        this.id = id;
    }

    abstract GameObject create();

    static GameObjectFactory getById(int id) {
        for (GameObjectFactory factory : values()) {
            if (factory.id == id) {
                return factory;
            }
        }
        throw IllegalArgumentException("Invalid ID: " + id);
    }
}
于 2013-07-16T01:02:32.603 回答