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

问题描述 投票:0回答:1

我正在使用pygame制作有关推动盒子的3d益智游戏。建立关卡需要一些时间,我用泡菜将它们存储起来:

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

此处的框是该级别中所有框的列表,这些是具有多个属性和方法的对象。

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): 
       #....

当然,最好完成游戏代码,然后进行所有关卡,但我希望能够随心所欲地添加游戏机制。

问题是,例如,当我可能决定框需要具有其他属性(如“可见”和“浮动”)时。添加这些属性后,我的新代码可能会说:

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

现在,我的旧级别将不起作用,因为腌制后的版本仍然具有缺少“可见”属性的旧盒子对象。

我当前的解决方案是假定所有旧的框对象都是可见的,如下所示:

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

但是随着代码的增长,这种快速修复方法变得难以为继。

是否有一种标准的方法可以解决此类兼容性问题,而无需重做所有级别?

python pygame pickle compatibility
1个回答
0
投票

我的操作方式:

我将通过使用继承来扩展您的框-因此您拥有标准框和增强框。这样,您的游戏就可以同时加载两者(因为原始box类仍然可以使用)。

我还将在增强型Box类上编写一个方法,该方法可以采用旧的Box对象,复制属性并返回增强型Box实例。

最后,我将编写一个脚本来用旧盒子加载您的泡菜文件,并将它们转换为继承的类,然后重新保存。

因此,当您想再次扩展盒模型时,请执行相同的操作……并继续前进,新建一个类,并执行升级脚本。

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

© www.soinside.com 2019 - 2024. All rights reserved.