我正在写一个简单的游戏,我们有一个对象的集合,玩家在网格上移动,收集硬币并避免怪物。
我的班级结构如下所示。
游戏控制器 - 负责产生硬币并跟踪游戏状态
网格 - 存储当前在网格上的对象的类,以及一些与网格相关的方法。
GridObject - 表示网格上对象的抽象类。例如玩家,怪物或硬币。
Player,Monster,Coin - 全部扩展了GridObject。
编写碰撞处理的最OOP方法是什么?期望的结果是:玩家击中怪物 - 结束游戏,玩家击中硬币 - 增加分数,怪物击中硬币 - 没有。
目前,当GridObject移动时,它会通知棋盘对象它想要移动;如果这会导致碰撞,我会在GameController上调用一个处理程序(通过一个监听器模式)来处理碰撞。在那个以两个GridObjects作为参数的处理程序中,我使用了很多“instanceof”命令来区分上述情况。
避免使用所有这些“instanceof”的最佳方法是什么,我读过这通常意味着糟糕的设计?
答案 0 :(得分:0)
您可以使用GridObject中的枚举来确定类型,而不是使用instanceof。这样,您只需比较枚举以检查哪些对象发生碰撞。例如,(警告,语法可能不完全正确)
public enum ObjectType {
Player, Monster, Coin
}
private final ObjectType type;
public GridObject(ObjectType type) {
this.type = type;
}
public ObjectType getType() {return type;}
然后在您的子类中,您必须执行以下操作:
public Player(your parameters) {
super(ObjectType.Player);
}
然后检查类型,你可以这样做:
switch(gridObject.getType()) {
case ObjectType.Player:
// do something
break;
case ObjectType.Monster:
// do something else
break;
case ObjectType.Coin:
// do something else
break;
}
答案 1 :(得分:0)
介绍一些接口怎么样:
interface Interactable {
InteractionResult interact(WorldEntity entity);
}
interface WorldEntity {
boolean isMonster();
boolean isPlayer();
boolean isPowerUp();
}
现在我们可以说,当玩家与我们可以做的其他事情互动时:
public InteractionResult interact(WorldEntity entity) {
if(entity.isMonster()) {
return new DeathInteraction(this);
}
...
}
你没有消除所有条件,但至少你开始组织你的抽象并将你的课程分离。