AS3 - 如何在XML文件中存储和使用数组

时间:2013-08-19 01:56:15

标签: xml actionscript-3

我在Flash中制作了一个简单的关卡编辑器(使用AS3),并使用2D数组值在屏幕上放置方块。

假设我有这个数组(非常简单的例子):

var level1:Array = new Array[[0, 0, 0, 0, 0], [1, 1, 1, 1, 1]];

(其中0表示无,1表示正方形)

如何将该数组存储在XML文件中,以便游戏可以从XML文件中读取该信息?

我是一个完整的XML菜鸟(从未使用过它)。

任何帮助都将不胜感激。

提前致谢,

Zoron19

2 个答案:

答案 0 :(得分:1)

对于一些如此简单的事情,使用XML将是一种浪费。

您可以使用join()轻松地将其存储为纯文本,然后使用split()将其转换回数组。这是将2D数组转换为字符串然后再转换为数组的示例。首先,我们有将您的数组转换为存储字符串的函数:

function levelToString(input:Array):String
{
    var output:Array = [];
    for each(var i:Array in input)
    {
        output.push(i.join(","));
    }

    return output.join("#");
}

使用您的关卡数据的示例:

var level:Array = [[0, 0, 0, 0, 0], [1, 1, 1, 1, 1]];
trace(levelToString(level)); // 0,0,0,0,0#1,1,1,1,1

现在我们可以使用此函数将其转换回2D数组:

function levelToArray(input:String):Array
{
    var base:Array = input.split("#");
    var output:Array = [];

    for each(var i:String in base)
    {
        output.push(i.split(","));
    }

    return output;
}

使用我们上面得到的字符串的例子:

var array:Array = levelToArray("0,0,0,0,0#1,1,1,1,1");
trace(array[0]); // 0,0,0,0
trace(array[1]); // 1,1,1,1

使用此方法,您的数据要小得多。

现在存储和加载该数据。如果要使用XML,则可以非常轻松地将级别数据存储在<level>节点上。假设您在名为levels.xml的XML文件中有此内容:

<levels>
    <level name="first">0,0,0,0,0#1,1,1,1,1</level>
    <level name="second">0,1,0,0,0#1,1,1,0,0</level>
</levels>

要将这些数据加载到游戏中,您需要使用URLLoader

var req:URLRequest = new URLRequest("levels.xml");
var loader:URLLoader = new URLLoader(req);
loader.addEventListener(Event.COMPLETE, dataLoaded);

function dataLoaded(e:Event):void
{
    var xml:XML = e.target.data as XML;

    // Described below.
    loadLevel(xml, "first");
}

然后loadLevel函数可以获取数据并从中加载级别:

function loadLevel(sourceXML:XML, levelName:String):void
{
    var levelData:Array = levelToArray(sourceXML.level.(@name == levelName));
    trace(levelData);

    // Work with the loaded data array.
    //
}

答案 1 :(得分:0)

这是一个简单的例子

名为levels.xml的xml文件,每行都有一个id表示行号,而值是一个字符串(如你所提到的)

<?xml version="1.0" encoding="UTF-8"?>

<levels>
     <row id="1">0,0,0,0,0</row>
     <row id="2">1,1,1,1,1</row>
</levels>

加载xml并获取值

 var xmlPath:String = "levels.xml";
 var loader:URLLoader = new URLLoader();
 loader.addEventListener(Event.COMPLETE, onLoadComplete);
 loader.load(new URLRequest(xmlPath));


 protected function onLoadComplete(event:Event):void {
     var xml:XML = XML(event.target.data);

     var nodes:String = String(xml.row.(@id == 1));//nodes value is 0,0,0,0,0
}

Hero是关于as3 as3 xml example

中关于xml的一些简单示例的链接