вторник, 21 августа 2012 г.

SharedObject

Привет. :)

Чтобы сохранить какие-нибудь данные из ActionScript можно использовать Shared Object.
Вот, например:
( Покликайте и обновите страницу )



Что это?
SharedObject - это фича, которая позволяет брать/сохранять данные из .swf файла.

Зачем это?
Чтобы сохранить данные, например, рекорды, текущий прогресс игры и т.д.

Какой объем данных я могу сохранить?
По умолчанию стоит ограничение 100кб, но можно увеличить до бесконечности, если пользователь согласится.

Как это работает?
SharedObject работает аналогично cookie в браузерах. На компьютере пользователя создается .sol файл с данными.

В Windows эти файлы можно найти в директории:
C:\Users\<Имя пользователя>\AppData\Roaming\Macromedia\Flash Player\#SharedObjects\<Случайный набор букв>\<Название домена>\<Путь до .swf файла>\<Имя локального общего объекта>.sol

Код примера выше:

Main.as:
package
{
    import flash.net.SharedObject;
    import flash.display.MovieClip;
    import flash.text.TextField;
    import flash.text.TextFormat;
    import flash.text.TextFormatAlign;
    import flash.events.MouseEvent;
    import flash.events.KeyboardEvent;
    import flash.ui.Keyboard;
    
    public class Main extends MovieClip
    {
        
        private const
        TEXT_FIELD_X : Number = 0.0,
        TEXT_FIELD_Y : Number = 72.35,
        TEXT_FIELD_WIDTH : Number = 300.0,
        TEXT_FIELD_HEIGHT : Number = 155.25,
        FONT_NAME : String = "Jokerman",
        FONT_SIZE : int = 100,
        FONT_COLOR : uint = 0xFF0000;
        
        private var
        sharedObject : SharedObject,
        counterTextField : TextField;
        
        public function Main () : void
        {
            this.init();
        }
        private function init () : void
        {
            this.createTextField();
            this.getSharedObject();
            this.updateTextField();
            
            stage.addEventListener( MouseEvent.CLICK, mouseClicked );
            stage.addEventListener( KeyboardEvent.KEY_DOWN, KeyDown );
        }
        
        private function mouseClicked ( e : MouseEvent ) : void
        {
            this.increaseCount();
            this.updateTextField();
        }
        
        private function KeyDown ( e : KeyboardEvent ) : void
        {
            if ( e.keyCode == Keyboard.SPACE )
            {
                this.resetCounter();
                this.updateTextField();
            }
        }
        
        private function resetCounter () : void
        {
            this.sharedObject.data.count = 0;
            this.sharedObject.flush();
        }
        
        private function getSharedObject () : void
        {
            this.sharedObject = SharedObject.getLocal( "Counter" );
            
            // If data.count is not specified
            // Set it to 0
            if ( this.sharedObject.data.count == undefined )
            {
                this.sharedObject.data.count = 0;
                this.sharedObject.flush();
            }
        }
        
        private function createTextField ()
        {
            this.counterTextField = new TextField();
            
            this.counterTextField.selectable = false;
            this.counterTextField.x = TEXT_FIELD_X;
            this.counterTextField.y = TEXT_FIELD_Y;
            this.counterTextField.width = TEXT_FIELD_WIDTH;
            this.counterTextField.height = TEXT_FIELD_HEIGHT;
            
            var textFormat : TextFormat = new TextFormat();
            textFormat.font = FONT_NAME;
            textFormat.size = FONT_SIZE;
            textFormat.color = FONT_COLOR;
            textFormat.align = TextFormatAlign.CENTER;
            
            this.counterTextField.defaultTextFormat = textFormat;
            
            stage.addChild( this.counterTextField );
        }
        
        private function updateTextField () : void
        {
            this.counterTextField.text = String( this.sharedObject.data.count );
        }
        
        private function increaseCount () : void
        {
            this.sharedObject.data.count ++;
            this.sharedObject.flush();
        }
    }
}


Попробуем чуть-чуть разобраться.


this.sharedObject = SharedObject.getLocal( "Counter" );
Берем данные из файла Counter.sol.


if ( this.sharedObject.data.count == undefined )
{
    this.sharedObject.data.count = 0;
}
Если файл еще не создался или он был очищен, тогда в data ничего не будет. Если это так - ставим data.count в 0.

this.sharedObject.flush();
Сохраняем данные.

Также есть метод clear - удаляет .sol файл, и свойство size - текущий размер .sol файла в байтах.

Доступ к общему объекту может получить не только тот .swf файл, который его создал.
Чтобы избежать конфликта имен, Adobe помещает .sol файлы в отдельной директории - пути до .swf файла.

Это выглядит так:
...< Название домена >\<Путь до .swf файла >\<"Название .swf файла".swf><Имя SharedObject>.sol

Выделенный путь задается по умолчанию. Путь можно изменить, указав его вторым параметром в методе getLocal.

Например, в одном .swf файле я создам общий локальный объект:
var sharedObject : SharedObject = SharedObject.getLocal( "Counter", "/" );
sharedObject.data.foo = "some value";

Тогда путь будет такой:
...< Название домена >\Counter.sol 

А в другом .swf файле я напишу:

var sharedObject : SharedObject = SharedObject.getLocal( "Counter", "/" );
sharedObject.clear();

И если эти .swf файлы находятся на одном домене, например, localhost ( т.е. я запускаю их локально ), то Counter.sol удалится.


Нанана, вот исходник.

Комментариев нет:

Отправить комментарий