属性
属性是物体物理特征的抽象。在虚拟世界里,这种做法常常会延伸到非物理的属性上,我们很快就会看到;但占主导地位的是物理属性(质量、密度、形状、颜色,等等)。
属性常常被实现为函数,这样很少用到的属性就可以在需要时才计算。不过,虽然属性在被读取时不会改变任何值,函数一般而言却会改变值:检查一个气球的“diameter”(直径)属性不会改变它的直径 1,但在气球上调用“inflate”(充气)函数就可能改变它。不过从实现的角度看,两者可以长得一模一样。
属性与对象类之间的相处并不总是顺畅。一个瓶子掉在地上会碎,是因为它作为瓶子属于“fragile objects”(易碎物体)的子类吗?还是因为它继承了一个高取值的“fragile”(易碎)属性?你需要多少封装?也许它碎掉,是因为它有一个值为“glass”(玻璃)的“made of”(材质)属性,而玻璃又有一个高取值的“fragile”属性?
要建立一套分类体系,既让物理系统能实现、又不把设计者变成程序员,这是个棘手的领域(更糟的是,许多设计者本来就是程序员出身)。严格说来,这不是朴素物理学的问题,而是表示方式的问题。
遗憾的是,这里其实还没有什么惯例可循。你只能为了让自己的物理能跑起来而做必须做的事。我唯一建议的是:让属性也可以(在面向对象的意义上)成为对象,这样你就能对它们进行量化。如果你能让虚拟世界引擎回答这样一个问题——“给我这个物体所有属性及其对应取值的清单”——那灵活性就足够了。
顺便说一句,当你在寻找区分物体的新办法时,手头有一份现有属性的清单非常有用。“这面魔法盾除了加上通常的防护加值之外,还该有什么作用?嗯,角色有身高、质量、速度这些属性,嗯……眼睛颜色、体毛浓密程度——嘿,我可以让他们一用这面盾就长出毛来!这肯定能把人吓一跳。我就把它做成矮人盾吧,因为矮人看重胡子,女的也一样,而且……”
在一个理想的世界里,物体的全部功能都能从它们的属性推导出来吗?能——在一个理想的世界里。你可以看出某个物体有一面坚硬、薄、平坦、结实、半锋利的表面,连接着一个长、坚固、轻却不脆的部件,顶上还有一根横杆,并由此推断出这个物体适合在草坪上挖洞。虚拟世界不是理想世界,因为这种程度的功能推导会把它压垮。也正因为不是理想世界,你能用铲子挖洞,靠的是“dig”(挖)这个动作认得铲子(也许还认得铁锹和鹤嘴锄)。除此之外,你没法用一面破盾加一根篱笆桩拼出一把铲子来。
所以,组合体的爱好者们,很抱歉:你们短时间内也不太可能靠这条路得到它。
朴素物理学没有不确定性原理。 ↩︎