четверг, 15 декабря 2011 г.

Начало преобразования с JavaScript в ActionScript

Начало

Ну вот, началось...

public class Main extends Sprite {
        var sc:Scene;
        public function Main():void {
            if (stage)
                init();
            else
                addEventListener(Event.ADDED_TO_STAGE, init);
        }
        private function init(e:Event = null):void {
            removeEventListener(Event.ADDED_TO_STAGE, init);
            sc = new Scene();
            var req:URLRequest = new URLRequest("http://имя_домена/test/models/p.obj");
            req.method = URLRequestMethod.POST;
            var load:URLLoader = new URLLoader();
            load.addEventListener(Event.COMPLETE, completeHandler);
            try {
                load.load(req);
            } catch (err:Error){
                trace(err.message);
            }
        }
        private function completeHandler(event:Event):void {
            sc.loadOBJ(event.target.data);
        }
}



И первым появляется класс Scene, который отвечает за обработку (парсинг obj) и отрисовку объектов. И первой очевидной разницей между ActionScript и JavaScript становится объявление классов/объектов (классы - это AS, объекты - JS):
И вместо:
function Scene(){
}
Получится:
public class Scene {
        public function Scene(){
        }
}
В JS для объявления public/private приходилось идти на хитрости
(public - this.имя_открытого_свойства, private - var имя_закрытого_свойства), в ActionScript уже явное определение.
На ActionScript можно забыть о небрежном стиле JS объявления  переменных:
var имя_переменной и все, нужно как минимум так:
var имя_переменной:* (конечно, желательно точно указывать тип, но можно и так)

Например, вместо данного кода на JS:
function Surface(A, B, C, D) {
        this.A = A;
        this.B = B;
        this.C = C;
        this.D = D;
    }
    Surface.isEqual = function(s1, s2) {
        return s1.A == s2.A && s1.B == s2.B && s1.C == s2.C && s1.D == s2.D;
};

Получается на AS3:
public class Surface {
        public var A:Number;
        public var B:Number;
        public var C:Number;
        public var D:Number;
        public function Surface(A:Number,B:Number,C:Number,D:Number) {
            this.A = A;
            this.B = B;
            this.C = C;
            this.D = D;
        }
        public static function isEqual(s1:Surface,s2:Surface):Boolean {
            return s1.A == s2.A && s1.B == s2.B && s1.C == s2.C && s1.D == s2.D;
        }
}
Еще одной неприятной мелочью явилось отсутствие в AS обращения к символам в строке как к элементам массива.
То есть вместо
var s="adasd";
s[0]="4";
необходимо использовать, например, такой способ:
var s:String="adasd";
var a:Array=s.split('');
a[0]='4';
s=a.join('');
Для чтения можно использовать метод charAt(номер_индекса).

Продолжение следует...

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

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