构建游戏及其关卡时如何处理兼容性问题

How to deal with compatibility while building game and its levels

我正在使用 pygame 制作一个关于推箱子的 3d 益智游戏。关卡需要一些时间来构建,我使用 pickle 存储它们:

pickle.dump([level_name,level_size,player,camera,boxes], f, protocol=-1)

这里"boxes"是关卡中所有框的列表,这些是具有多个属性和方法的对象。

class Box:
    def __init__(self,x,y,z,pushable=True,color=(200,100,50)):
        self.x, self.y, self.z = x, y, z
        self.pushable = pushable
        self.color=color

    def draw(self): 
       #....

当然最好先完成游戏代码,然后再制作所有关卡,但我希望能够边玩边添加游戏机制。

问题是,例如,我可能会决定框需要具有其他属性,例如 "visible" 和 "floating"。添加这些属性后,我的新代码可能会显示:

for b in boxes:
    if b.visible: b.draw()

现在我的旧关卡将无法使用,因为腌制版本仍然包含缺少 "visible" 属性的旧盒子对象。

我目前的解决方案是假设所有旧的盒子对象都是可见的,如下所示:

for b in boxes:
    if (not hasattr(b,'visible')) or b.visible: b.draw()

然而,随着代码的增长,这些快速修复感觉不可持续。

是否有一种标准方法可以在不重做所有关卡的情况下处理这类兼容性问题?

我会这样做的方式:

我会通过继承来扩展你的盒子——所以你有标准的盒子和增强的盒子。这样你的游戏就可以加载两者(因为原来的盒子 class 仍然有效)。

我还会在您的增强框 class 上编写一个方法,它可以获取旧框对象、复制属性和 return 增强框实例。

最后我会写一个脚本来加载你的 pickle 文件和旧盒子,并将它们转换为继承的 classes,然后重新保存。

所以当你想再次扩展你的盒子模型时 - 做同样的事情......并继续前进,一个新的 class 和一个升级脚本。

当您最终准备就绪时,您可以重构并删除继承层。