СОХРАНЕНИЕ Flash (AS3) данных в XML - PullRequest
4 голосов
/ 26 июня 2011

Я уже несколько часов провожу во всех сетях, включая переполнение стека, пытаясь найти надежный, работоспособный пример сохранения информации во Flash в файл XML.

Я хочу занять позициюдва разных типа объектов и экспортировать списки каждого в XML.Мы назовем объекты ball и bat .

Итак, я бы хотел, чтобы XML выглядел примерно так:

<objects>
    <ball xPos=34 yPos=43/>
    <ball xPos=12 yPos=94/>
    <bat xPos=1 yPos=39/>
</objects>

Звучит достаточно просто, но я не смог найти ни одного приличного примера того, что именно может сделать код AS3.Данные находятся в двух векторах MovieClips, поэтому я буду использовать bats [i] .x и bats [i] .y для входных значений.

Как я могу создать этот XML и сохранить его где-нибудь локальносмотреть?Спасибо за любую помощь, это очень расстроило.

Ответы [ 4 ]

17 голосов
/ 26 июня 2011

Работать с XML в AS3 очень просто, поэтому остановимся на ответе 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 для XML класса в AS3, чтобы узнать больше.

Сохранение вашего файла:

// 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-файлов. Вы можете получить SWF и источник на http://divillysausages.com/blog/xml_compressor_uncompressor, если вам интересно

2 голосов
/ 26 июня 2011

ActionScript 3.0 построен с E4X , поэтому вы можете создавать объекты XML во время выполнения и затем записывать их на диск в виде текстовых файлов (с расширением .xml, конечно).

если вы программируете для резидентной Flash, вы можете использовать flash.net.FileReference , но этот подход предоставляет диалоговое окно для загрузки / сохранения файлов. если вы программируете в AIR, вы можете загружать / сохранять файлы как фоновые процессы, используя flash.fileSystem.File .

Я предполагаю, что вы программируете для браузера и хотели бы обрабатывать данные в фоновом режиме. в этом случае у вас также есть (очень распространенная) опция использования Local Shared Object для хранения и извлечения вашего объекта данных XML.

больше здесь (включая пример кода): flash.net.SharedObject

1 голос
/ 20 мая 2014

Я думаю, что в некоторых случаях может быть проще создать строку в 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>

Это позволит легко вносить изменения и добавлять атрибуты к объектам позже.

также, если вы используете массив видеороликов, это становится еще проще.

0 голосов
/ 15 января 2014

Просто дополнение к ответу divillysausages (что я проголосовал).

Если вы хотите добавить значение в тег xml, например:

<ball>red ball</ball>

Вы можете использовать:

var ball:XML = <ball />.appendChild("red ball");

Очевидно, вы можете передать в appendChild переменную String.

...