通过用游戏描述它,将使问题最可描述。

在塔防游戏中,玩家可以建造多种类型的炮塔,
这是炮塔工厂的代码:-

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/

10-11 18:10