运行 对象内的不同方法取决于对象的 '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()
都会调用正确的实现!
我正在尝试管理游戏中的道具。
假设我的游戏中有 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()
都会调用正确的实现!