运行 对象内的不同方法取决于对象的 'type'

Running different methods within an object depending on the 'type' of object

我正在尝试管理游戏中的道具。

假设我的游戏中有 7 个 'platforms',我想随机生成一个道具,每个平台最多 1 个(这是一个垂直滚动的 'infinite' 类型的游戏)。

所以,我有 5 种不同的道具,我可以做这样的事情(其中 PowerUp 是有效的 class)- 这里传递给构造函数的“7”是精灵的数量单个对象(即它们是一批精灵)- 7 所以我们可以在每个平台上放置一个并根据需要打开和关闭它们(我有一个 'drawable' 布尔数组,它允许我为个人执行此操作一批精灵)。

PowerUP powerUp1 = new PowerUp(7);
PowerUP powerUp2 = new PowerUp(7);
PowerUP powerUp3 = new PowerUp(7);
PowerUP powerUp4 = new PowerUp(7);
PowerUP powerUp5 = new PowerUp(7);

然后我将它们添加到要绘制的对象列表中:

powerUpsList.add(powerUp1); //etc...

然后我可以这样做:

(for int i = 0; i < powerUpsList.size();i++){

    if (powerUpsList.get(i).hasBeenCollected();
            powerUpsList.get(i).runPowerUp(); //Carry out the specific code for this powerup if it has been activated
}

我遇到的唯一问题是我实际上创建了 35 个精灵(5 个批次,每批 7 个)- 当我添加更多 powreups 时更多。我只会一次最多使用 7 个精灵。

因此,我要做的是这样的:

 powerUp = new PowerUp(7);

然后,当我生成一个 powerup 时,在获得它的随机类型后-(例如,powerUp1),而不是简单地在相关批次中打开相关的,我正在更改特定精灵的属性批次。因此,如果生成时的平台编号为 7,我将批次中第 7 个精灵的帧设置为相关帧,然后我想要 运行 代码。

但是,我似乎必须先使用 switch 语句来打开对象枚举,然后才能 运行 相关逻辑。

switch (PowerUpType){

    case PowerUpType.powerup1: {logicForPowerUp1;break}
    case PowerUpType.powerup2: {logicForPowerUp2;break}

    //etc

}

有什么方法可以 运行 逻辑完全取决于使用这批 7 个精灵的对象枚举?我似乎无法找到一种方法来执行此操作并使用开关,老实说,我觉得很乱。

你可以像这样对枚举进行一些修改,假设 logicForPowerUp1/logicForPowerUp2 等是 class 中的方法,其中有 switch 语句

public class PowerUpUser {
    private PowerUpType powerUpType;

    public PowerUpUser(PowerUpType powerUpType) {
        this.powerUpType = powerUpType;
    }

    public void usePowerUp() {
        // this replaces the switch statement
        powerUpType.execute(this);
    }

    private void logicForPowerUp1() {

    }

    private void logicForPowerUp2() {

    }

    private enum PowerUpType {
        PowerUp1 {
            @Override
            public void execute(PowerUpUser powerUpUser) {
                powerUpUser.logicForPowerUp1();
            }
        },
        PowerUp2 {
            @Override
            public void execute(PowerUpUser powerUpUser) {
                powerUpUser.logicForPowerUp2();
            }
        };

        public abstract void execute(PowerUpUser powerUpUser);
    }
}

您可以子类化道具,然后使用静态工厂 return 它们。由于方法覆盖,您可以执行以下操作: abstract public class BasePowerUp { abstract public void calculatePowerUp(); abstract public void performPowerUp(GameState state); abstract public void handleFrameBuffer(FrameBuffer fb); } //arbitrary methods, fill in what you would do... public PowerUp1 extends BasePowerUp { @Override public void calculatePowerUp() { /* ... */ } // and so on }

然后在任何地方,也许在 BasePowerUp 中有一个像这样的方法: public static BasePowerUp getPowerUp(int which) { switch (which) { case 1: return new PowerUp1(); //etc } }

如果您正确设置了方法,以后每次调用 calculatePowerUp() 都会调用正确的实现!