原文链接:http://www.brighthub.com/hubfolio/matthew-casperson/articles/74720.aspx
上一课我们看到了如何创建一个简单的实体(Entity)来显示一个嵌入的资源图片。在一个真正的游戏中,可能需要创建成百上千个这样的实体(Entity)。对于一个程序员来说,如果都用ActionScript去创建也没什么问题,可是对于关卡设计师或其他人,让他一行行的写代码来设计关卡,可能就有点困难了。PBE提供了这样一个功能:在XML文件中编辑关卡,然后载入这个XML文件来创建我们的游戏世界。好,让我们看看如何做。
在assets文件夹中创建2个XML文件:level1.xml和levelDescriptions.xml。

编辑level1.xml:
<things version="1">
<entity name="Player">
<component type="com.pblabs.rendering2D.SimpleSpatialComponent" name="Spatial">
<position type="">
<x>0</x>
<y>0</y>
</position>
<spatialManager componentReference="SceneDB"/>
</component>
<component type="com.pblabs.rendering2D.SpriteRenderer" name="Render">
<scene componentReference="SceneDB"/>
<positionProperty>@Spatial.position</positionProperty>
<fileName>assets/player.png</fileName>
</component>
</entity>
<group name="Level1">
<objectReference name="Player"/>
</group>
</things>
解释一下:
<things version="1">
这是根节点,所有关卡数据都包含在其中。
<entity name="Player">
这里定义了实体Player。注意,只是定义,并没有实例化。实例化是在后面的<group>标签中。
<component type="com.pblabs.rendering2D.SimpleSpatialComponent" name="Spatial">
<position type="">
<x>0</x>
<y>0</y>
</position>
<spatialManager componentReference="SceneDB"/>
</component>
public static function initializeScene(view:IUITarget, sceneName:String = "SceneDB",sceneClass:Class=null,spatialManagerClass:Class = null,sceneAlignment:SceneAlignment = null):IEntity{}
原来"SceneDB"是默认的名称。
<component type="com.pblabs.rendering2D.SpriteRenderer" name="Render">
<scene componentReference="SceneDB"/>
<positionProperty>@Spatial.position</positionProperty>
<fileName>assets/player.png</fileName>
</component>
为Player创建Render组件。中间的内容和上一课的程序代码对照一下,应该很好理解。
<group name="Level1">
<objectReference name="Player"/>
</group>
定义一个组,名叫"Level1"。用<objectReference>标签引用前面定义好的实体(entity)。还可以用<groupReference>引用其它的组。
再来看levelDescriptions.xml文件。
<levelDescriptions>
<level index="0">
</level>
<level index="1" name="Level-1">
<file filename="assets/level1.xml"/>
<group name="Level1"/>
</level>
</levelDescriptions>
其实我们在程序中直接引用的是这个文件。<levelDescriptions>是根节点。每一个关卡的数据包含在<level>标签中。每个<level>标签有个index属性。注意保持这个值的唯一性。我先把<level index="0">节点留空。这个节点好像有特殊的功能。待以后再仔细研究。
<level index="1" name="Level-1">
<file filename="assets/level1.xml"/>
<group name="Level1"/>
</level>
这里name="Level-1"是关卡名称,但是我们在程序中引用的最多的还是index属性。<file>中的fileName属性指向具体的关卡数据文件。接着还要用<group>标明要创建的组,因为一个文件中可以包含很多组,也就是说一个文件中可以包含若干关卡中的内容,或各个关卡中公用的内容。而本关中具体要用到哪些,也就是要真正实例化哪些,就用<group>标明。
好,把这2个文件嵌入到程序中,GameResources.as:
package
{
import com.pblabs.engine.resource.ResourceBundle;
public class GameResources extends ResourceBundle
{
[Embed(source = 'assets/levelDescriptions.xml', mimeType='application/octet-stream')]
public var levelDesc:Class;
[Embed(source = 'assets/level1.xml', mimeType='application/octet-stream')]
public var level1:Class;
[Embed(source = 'assets/player.png')]
public var player:Class;
}
}
注意!与图片等资源不同的是,XML文件一定要加上mimeType='application/octet-stream'。
最后一步,回到我们的主程序中,Main.as:
package
{
import com.pblabs.engine.PBE;
import com.pblabs.rendering2D.ui.SceneView;
import flash.display.Sprite;
import flash.events.Event;
import com.pblabs.rendering2D.SimpleSpatialComponent;
import com.pblabs.rendering2D.SpriteRenderer;
[SWF(width="480", height="384", backgroundColor="0x7F92FF")]
public class Main extends Sprite
{
public function Main():void {
//注册XML文件中用到的类
PBE.registerType(com.pblabs.rendering2D.SimpleSpatialComponent);
PBE.registerType(com.pblabs.rendering2D.SpriteRenderer);
PBE.startup(this);
PBE.addResources(new GameResources());
var sceneView:SceneView = new SceneView();
PBE.initializeScene(sceneView);
//载入关卡数据
PBE.levelManager.load("assets/levelDescriptions.xml", 1);
}
}
}
这里最容易忘记的就是注册XML文件中用到的类。因为这些类在主程序中并没有用到,程序编译时就不会编译进去。而载入关卡时用到了它们,就会发生错误。我们必须手动import,并用PBE.registerType()注册上。最后,终于可以载入了!用PBE的levelManager:
PBE.levelManager.load("assets/levelDescriptions.xml", 1);
第2个参数是我们要初始化的关卡ID,也就是<level index="1" name="Level-1">中的index。
好,编译运行一下看看效果吧!

浙公网安备 33010602011771号