在不复制代码的情况下,从工厂实例化一个对象(如炮塔)的草稿(即原型)
instantiate draft (i.e. prototype) of an object (e.g. turret) from factory without duplicating code
用游戏来描述,可以使问题更易于描述。
在塔防游戏中,玩家可以建造多种类型的炮塔,这里是炮塔工厂的代码:-
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;
我必须对每种类型的炮塔都这样做,当炮塔的设计改变时,我也必须更新另一个。
会导致可维护性问题
我不确定这是不是一个答案,但我没有足够的声誉来评论。
我认为第一种方法是好的,如果你不想传播逻辑,也许你可以在禁用旋转时将你的对撞机从物理引擎中分离出来,如果你的物理引擎不支持这个,那么你就可以停止它。
你只需要重新启用你的组件当你启用电流
相关文章:
- 函数向量_指针有不同的原型,我可以构建一个吗
- 功能原型的目的
- getline() 的原型/库是什么;
- 具有enable_if外部类原型的模板类构造函数定义
- 函数如何通知用户它基于函数原型抛出异常?
- 在C++中包含原型文件的正确方法是什么?
- 在函数中拥有函数原型的目的是什么?
- 什么..(省略号)作为函数原型中唯一的函数参数,C++?
- 是否可以使用 libclang python 解析 cpp 文件中没有标头的函数原型
- 如果原型是本地的,则使用流 I/O C++类型约束将失败
- 如何进行原型消息交叉引用?
- 有没有办法在C++编译时更改函数原型?
- 省略函数原型中的返回类型
- 在 linux 原因上运行自定义原型插件
- 为什么以及如何使用原型设计模式
- 您是否必须随项目一起交付原型文件?
- 如何在C++中遍历谷歌原型地图?
- 错误:'EM::EM(...)' 的原型与类 'EM' 中的任何原型都不匹配
- 功能原型,没有定义
- 在不复制代码的情况下,从工厂实例化一个对象(如炮塔)的草稿(即原型)