在不复制代码的情况下,从工厂实例化一个对象(如炮塔)的草稿(即原型)



用游戏来描述,可以使问题更易于描述。

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

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;    

我必须对每种类型的炮塔都这样做,当炮塔的设计改变时,我也必须更新另一个。

会导致可维护性问题

我不确定这是不是一个答案,但我没有足够的声誉来评论。

我认为第一种方法是好的,如果你不想传播逻辑,也许你可以在禁用旋转时将你的对撞机从物理引擎中分离出来,如果你的物理引擎不支持这个,那么你就可以停止它。

你只需要重新启用你的组件当你启用电流

最新更新