[英]SAVING Flash (AS3) data to XML
几个小时以来,我已经遍布各种各样的互联网,包括Stack Overflow,试图找出一个可以将Flash中的信息保存到XML文件中的可行实例。
我想获取两种不同类型对象的位置,并将每个对象的列表导出为XML。 我们称之为物体球和蝙蝠 。
所以,我希望XML看起来像:
<objects>
<ball xPos=34 yPos=43/>
<ball xPos=12 yPos=94/>
<bat xPos=1 yPos=39/>
</objects>
听起来很简单,但我还没有找到一个正确的例子来确切说明AS3代码可以实现这一点。 数据在MovieClip的两个向量中,所以我将使用bats [i] .x和bats [i] .y作为输入值。
如何创建此XML,并将其保存在本地查看的位置? 谢谢你的任何帮助,这已经证明非常令人沮丧。
在AS3中使用XML非常简单,所以要使用一些代码扩展TheDarkIn1978的答案:
创建XML对象:
var objs:XML = new XML( <objects /> ); // create the <objects /> node
// for your objects
var ball1:XML = new XML ( <ball /> ); // create the <ball /> node
ball1.@xPos = 12; // add 12 as an attribute named "xPos"
ball1.@yPos = 42; // add 42 as an attribute named "yPos"
objs.appendChild( ball1 ); // add the <ball> node to <objects>
// an example of using variables in your xml
var name:String = "something";
var sx:XML = new XML( <{name} /> ); // creates a node <something />
使用TheDarkIn1978到AS3中的XML
类来了解更多信息。
保存文件:
// saving out a file
var f:FileReference = new FileReference;
f.save( sx, "myXML.xml" ); // saves under the name myXML.xml, "sx" being your root XML node
在保存之前压缩XML(使用大型XML文件,这可以节省很多):
// compressing before saving
var f:FileReference = new FileReference;
var bytes:ByteArray = new ByteArray;
bytes.writeUTFBytes( myXML ); // "myXML" being your root XML node
bytes.compress(); // compress it
f.save( bytes, "myXML.xml" );
加载压缩XML,解压缩并检索XML对象:
// uncompressing a compressed xml
var loader = new URLLoader;
loader.dataFormat = URLLoaderDataFormat.BINARY;
// listen for our events
loader.addEventListener( Event.COMPLETE, this._onLoad );
loader.addEventListener( IOErrorEvent.IO_ERROR, this._onFail ); // not shown
loader.addEventListener( SecurityErrorEvent.SECURITY_ERROR, this._onSecurityError ); // not shown
private function _onLoad( e:Event ):void
{
var loader:URLLoader = e.target as URLLoader;
// get the data as a bytearray
var ba:ByteArray = loader.data as ByteArray;
// uncompress it
try
{
ba.uncompress();
}
catch ( e:Error )
{
trace( "The ByteArray wasn't compressed!" );
}
// get our xml data
myXML = XML( ba );
}
我创建了一个用于压缩/解压缩XML文件的简单工具。 如果您有兴趣,可以访问http://divillysausages.com/blog/xml_compressor_uncompressor获取SWF和来源
ActionScript 3.0是使用E4X构建的,因此您可以在运行时创建XML对象,然后将它们作为文本文件写入磁盘(当然,扩展名为.xml)。
如果你是为浏览器驻留Flash编程,你可以使用flash.net.FileReference ,但这种方法提供了一个加载/保存文件的对话窗口。 如果您在AIR中编程,则可以使用flash.fileSystem.File将文件作为后台进程加载/保存。
我假设您正在为浏览器编程,并希望在后台处理数据。 在这种情况下,您还可以使用(非常常见)选项来使用本地共享对象来存储和检索XML数据对象。
更多这里(包括示例代码): flash.net.SharedObject
我认为在某些情况下可能更容易在as3中创建一个字符串,然后在最后将其转换为xml:
import flash.geom.Point;
var cordiantes = [new Point(34,12),new Point(14,2), new Point(10,15)];
var objects = ["ball","ball","bat"];
// starting the object node.
var myXmlStr = "<objects>";
for(var i = 0; i < objects.length; i++)
{
// adding things to the string between the object nodes.
myXmlStr += "<" + objects[i] + " xPos= '" + cordiantes[i].x + "' yPos='" + cordiantes[i].y + "' />";
}
// closing the objects node.
myXmlStr += "</objects>";
// turning the string into xml.
var xmlfinal:XML = XML(myXmlStr);
trace(xmlfinal);
输出是:
<objects>
<ball xPos="34" yPos="12"/>
<ball xPos="14" yPos="2"/>
<bat xPos="10" yPos="15"/>
</objects>
这样可以轻松地进行更改并在以后向对象添加属性。
如果你使用的是一系列的动画片段,那就更容易了。
只是对divillysausages答案的补充(我赞成)。
如果要向xml标记添加值,例如:
<ball>red ball</ball>
您可以使用:
var ball:XML = <ball />.appendChild("red ball");
显然你可以传递给appendChild一个String变量。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.