mik*_*era 3 language-agnostic design-patterns data-structures
我正在开发一款小型在线游戏,需要存储大量(100多种)不同类型游戏对象的大量信息.
我正在尝试决定是否通过代码生成此数据或存储在某些配置文件中.
数据生成方法类似于(在java-ish伪代码中):
(within a set of functions executed once at program startup)
....
// create grass terrain
grass=new GameObject();
grass.inheritProperties(generic_terrain);
grass.set(NAME,grass);
grass.set(MOVEABLE,true);
grass.set(MOVECOST,10);
grass.set(IMAGE_INDEX,1);
....
Run Code Online (Sandbox Code Playgroud)
而配置文件方法可能只使用XML类型格式,例如
(within terrain.xml file)
....
<terrain name="grass">
<inherit class="generic_terrain"/>
<property key="NAME" value="grass"/>
<property key="MOVABLE" value="true"/>
<property key="MOVECOST" value="10"/>
<property key="IMAGE_INDEX" value="1"/>
</terrain>
....
Run Code Online (Sandbox Code Playgroud)
一些要点:
哪种方法最适合这种情况?更重要的是为什么?
就个人而言,我喜欢尽可能多地进行配置.这样做的原因是,在某些时候我可能想要以完全不同的方式重用我为游戏编写的代码.如果源代码中充斥着对实现特定细节的引用,那么这将变得更加困难.
当你想要开始描述对象的行为以及它们的值时,会出现一个有趣的配置方法.考虑一个简单的例子,你有一个需要"捕捉"球对象的杯子对象.你可以表达它们:
<object name="ball">
<property key="shape" value="circle"/>
<property key="movable" value="true"/>
<property key="speed" value="10"/>
</object>
<object name="cup">
<property key="shape" value="rectangle"/>
<property key="movable" value="true"/>
<property key="speed" value="6"/>
<property key="catches" value="ball"/>
</object>
Run Code Online (Sandbox Code Playgroud)
这里的问题是,你仍然需要在代码中定义"捕获"的内容.如果您使用的是解释性语言,则可以执行以下操作:
<object name="cup">
<property key="shape" value="rectangle"/>
<property key="movable" value="true"/>
<property key="speed" value="6"/>
<oncollision>
if (collided.getName() == "ball") {
collided.destroy();
points++;
}
</oncollision>
</object>
Run Code Online (Sandbox Code Playgroud)
现在你已获得描述一个物体的能力表现,以及它是什么是.这里唯一的问题是,如果您不使用解释语言,则无法在运行时定义代码.这是Lua在游戏开发中如此受欢迎的原因之一.它既可以作为声明语言也可以作为程序语言使用,并且很容易嵌入到已编译的应用程序中.所以你可以表达这样的情况:
object {
name='ball';
movable=true;
speed=10;
}
object {
name='cup';
movable=true;
speed=6;
oncollision=function(collided)
if collided:getName() == "ball" then
collided:destroy();
points++;
end
end;
}
Run Code Online (Sandbox Code Playgroud)