我正在使用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()
但是随着代码的增长,这种快速修复方法变得难以为继。
是否有一种标准的方法可以解决此类兼容性问题,而无需重做所有级别?
我的操作方式:
我将通过使用继承来扩展您的框-因此您拥有标准框和增强框。这样,您的游戏就可以同时加载两者(因为原始box类仍然可以使用)。
我还将在增强型Box类上编写一个方法,该方法可以采用旧的Box对象,复制属性并返回增强型Box实例。
最后,我将编写一个脚本来用旧盒子加载您的泡菜文件,并将它们转换为继承的类,然后重新保存。
因此,当您想再次扩展盒模型时,请执行相同的操作……并继续前进,新建一个类,并执行升级脚本。
最终准备就绪后,您可以重构并删除继承层。