渡口

Flash AS3

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 :: 管理 ::

原文链接: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>
为Player创建Spatial组件。<position>中是坐标。<spatialManager>中指定"SceneDB"为spatialManager。这个"SceneDB"是哪来的?查看一下PBE.initializeScene()的定义:
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。

好,编译运行一下看看效果吧!

posted on 2011-06-20 10:46  BlueJack  阅读(797)  评论(0)    收藏  举报