通过用游戏描述它,将使问题最可描述。
在塔防游戏中,玩家可以建造多种类型的炮塔,
这是炮塔工厂的代码:-
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.创建一个真实的炮塔,然后将其与鼠标一起移动
炮塔的功能类似于真实炮塔,与其他炮塔相撞并射击-甚至只是原型(prototype),玩家在拖拉。
一种缓解措施是创建一个魔术标记,使转塔成为“原型(prototype)”(又称禁用)。
这种解决方法必须在许多游戏逻辑部分中传播-检查某个炮塔是否已禁用....子弹是否与“已禁用”的炮塔相撞...依此类推。
这很乏味,会引起错误,并会降低代码的可读性和可维护性。
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;
我必须对每种类型的转塔都这样做,并且当转塔的设计变更时,我也将不得不更新另一个。
它将引起可维护性问题。
最佳答案
不确定是否可以作为答案,但我没有足够的声誉来发表评论。
我认为第一种方法很好,如果您不想传播逻辑,也许您可以在禁用turrent时将对撞机与物理引擎分离,如果您的物理引擎不支持此功能,那么对于射击,您将可以阻止它。
您只需在启用turrent时重新启用组件即可。
关于c++ - 无需复制代码即可从工厂实例化对象(例如炮塔)的草图(即原型(prototype)),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39361293/