用游戏来描述,可以使问题更易于描述。
在塔防游戏中,玩家可以建造多种类型的炮塔,这里是炮塔工厂的代码:-
Entity* createTurret(EnumTurretType turretType){
Entity* turret = ...;
switch(turretType){
case FIRE_TURRET:{
GraphicObject* fireCG=graphicFactory()->create(FIRE);
//.... initialize a few mesh, and a few physic solid objects
turret->attachComponent(GraphicObject);
}break;
case ICE_TURRET:{
//......
}break;
//.... 20-30 types
}
return turret;
}
到目前为止一切都很好。游戏是可玩的,每个人都很高兴。
现在是让玩家使用鼠标建造炮塔的步骤,如果玩家在鼠标移动时可以看到炮塔的轮廓(例如褪色全息图),那将是很酷的。
问题:如何在不重复代码的情况下实现?
我的方法不好
1。创建一个真正的炮塔,然后用鼠标移动炮塔
炮塔会像真实的炮塔一样工作,与其他炮塔相撞并射击-即使它只是一个原型,被玩家拖着到处走。
缓解是创造一个魔法旗帜,使炮塔成为"原型"(即。禁用)。
这个治疗必须在许多游戏逻辑部分中传播-检查某个炮塔是否被禁用....子弹是否与"失效"的炮塔相撞……等等。
这是乏味的,引起错误,并降低代码的可读性和一点可维护性。
2。复制上面的代码,然后删除不相关的内容
只复制粘贴图形部分。如果存在任何与游戏逻辑相关的图像,则必须重新以图像风格进行硬编码。例如:-
//pseudo-code
Physical gun will be 3 meter above the turret's base;
Draw graphical gun at the physical gun position;
…必须转换为…
A graphical gun will be 3 meter above the turret's base;
我必须对每种类型的炮塔都这样做,当炮塔的设计改变时,我也必须更新另一个。
会导致可维护性问题
我不确定这是不是一个答案,但我没有足够的声誉来评论。
我认为第一种方法是好的,如果你不想传播逻辑,也许你可以在禁用旋转时将你的对撞机从物理引擎中分离出来,如果你的物理引擎不支持这个,那么你就可以停止它。
你只需要重新启用你的组件当你启用电流