Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Из AS 2 в AS3 levels в AS2 как сделать в AS3 (http://www.flasher.ru/forum/showthread.php?t=155292)

Andrej 01.05.2011 18:36

Из AS 2 в AS3 levels в AS2 как сделать в AS3
 
Доброго времени суток.Есть код в AS2.0 (совсем не знаком) пытаюсь переделать в AS 3.0.На сцене 2 мувика trailer и car.В них 2 мувика сцепки в car dotOut в trailer dotIn.Ну и смысл мы ими управляем.Никак не могу понять функцию correctTrailer(slave, master) если трейсить trace(slave); выводится _level0.trailer,если же trace(master);то _level0.car, что мне не известно и тут тупик,что за левел и от куда берется.
Далее пишу код в AS 2.0 взятый из сети,пропуская функцию клавиатуры управление кнопками.
Код AS1/AS2:

 
 
speed = 0;
speedLimit = 8;
speedStep = .5;
rotLimit = 35;
rotStep = 3;
trailerRotLimit = 55 / 180 * Math.PI;
 
function move(){
        if(Math.abs(speed) > 0) {
                car._rotation += car.left._rotation * speed / car.left._x;
        }
        angle = car._rotation * Math.PI / 180;
        speedX = speed * Math.cos(angle);
        speedY = speed * Math.sin(angle);
        car._x += speedX;
        car._y += speedY;
 
 
}
 
function correctTrailer(slave, master){
 
        if(speed){
 
                //Пересчитываем точку в родительскую систему координат
                var masterDot = {x:master.dotOut._x, y:master.dotOut._y};
 
                master.localToGlobal(masterDot);
                globalToLocal(masterDot);
 
                var dx = masterDot.x - slave._x;
                var dy = masterDot.y - slave._y;
 
                //Угол между прицепом и машиной
                var aRad = Math.atan2(dy, dx);
 
                //Угол поворота самой машины
                var masterRotRad = master._rotation / 180 * Math.PI;
 
                //Разница между ними
                var dAngle = masterRotRad - aRad;
 
                //Коррекция перехода 180/-180 градусов
                if (dAngle > Math.PI) {
                        dAngle = -Math.PI*2 + dAngle;
                } else if (dAngle < -Math.PI) {
                        dAngle = Math.PI*2 + dAngle;
                }
                if(speed < 0) {
                        //Выполняется только при движении назад
                        //Ограничение на поворот и торможение из-за прицепа
                        if(dAngle >= trailerRotLimit) {
                                aRad = masterRotRad - trailerRotLimit;
                                speed *= .8;
                        } else if(dAngle <= -trailerRotLimit) {
                                aRad = masterRotRad + trailerRotLimit;
                                speed *= .8;
                        }
 
                        //Обратная связь на машину в результате торможения
                        //Коэффициенты .5 и 3 подбираются вручную
                        if(dAngle >= trailerRotLimit * .5) {
                                master._rotation += speed / speedLimit * 3;
                        } else if(dAngle <= -trailerRotLimit * .5) {
                                master._rotation -= speed / speedLimit * 3;
                        }
                }
 
                //Убираем паразитную скорость (погрешность округления чисел)
                if(Math.abs(speed) < speedStep && !Key.isDown(Key.DOWN)) {
                        speed = 0;
                }
 
                //Поворачиваем прицеп к машине
                var a = aRad / Math.PI * 180;
                slave._rotation = a;
 
                //Пододвигаем прицеп чтобы была стыковка
                slave._x = masterDot.x - Math.cos(aRad) * slave.dotIn._x;
                slave._y = masterDot.y - Math.sin(aRad) * slave.dotIn._x;
 
        }
}
onEnterFrame = function() {
        move();
        correctTrailer(trailer, car);
        }

Далее пишу код в AS 3.0 который состряпал я,пропуская функцию клавиатуры управление кнопками.

Код AS3:

 
 
                var angle:Number=0;
        var speedX:Number=0;
        var speedY:Number=0;
var speedLimit:Number = 8;
var speedStep:Number = .5;
var rotLimit:Number = 35;
var rotStep:Number = 3;
                var trailerRotLimit:Number = 55 / 180 * Math.PI;
        var speed:Number=0;
            var pressUp:Boolean = false;
                var pressDown:Boolean = false;
              var pressLeft:Boolean = false;
            var pressRight:Boolean = false;
 
 
          function startl1():void{
 
                car.addEventListener(Event.ENTER_FRAME, ModifyCar);       
 
                                stage.addEventListener(Event.ENTER_FRAME,corektirovka);
                  }
 
 
                function corektirovka(eFrame:Event)
        {
                        correctTrailer (trailer, car);
                }
 
                function ModifyCar(eFrame:Event)
        {
 
                        if (pressLeft)
            {
                        if (car.lefts.rotation > - rotLimit) {
                        car.lefts.rotation = car.rights.rotation -= rotStep;
                }
            }
                        else if (pressRight) {
                if (car.lefts.rotation < rotLimit) {
                        car.lefts.rotation = car.rights.rotation += rotStep;
                }
        }
 
                                if (pressUp) {
                speed += (speed < speedLimit)? speedStep : 0;
        } else if (pressDown) {
                speed += (speed > -speedLimit)? -speedStep : 0;
        } else {
                speed += (speed < 0)? speedStep : (speed > 0)? -speedStep : 0;
        }
 
                                if(Math.abs(speed) > 0) {
                car.rotation += car.lefts.rotation * speed / car.lefts.x;
        }
        angle = car.rotation * Math.PI / 180;
        speedX = speed * Math.cos(angle);
        speedY = speed * Math.sin(angle);
        car.x += speedX;
        car.y += speedY;
 
 
 
                                }
 
 
                function correctTrailer(slave, master){
 
 
        if(speed){
 
 
 
 
                var masterDot={x:master.dotOut.x, y:master.dotOut.y};
 
                master.localToGlobal(masterDot);
                globalToLocal(masterDot);
 
                var dx = masterDot.x - slave.x;
                var dy = masterDot.y - slave.y;
 
                //Угол между прицепом и машиной
                var aRad = Math.atan2(dy, dx);
 
                //Угол поворота самой машины
                var masterRotRad = master.rotation / 180 * Math.PI;
 
                //Разница между ними
                var dAngle = masterRotRad - aRad;
 
                //Коррекция перехода 180/-180 градусов
                if (dAngle > Math.PI) {
                        dAngle = -Math.PI*2 + dAngle;
                } else if (dAngle < -Math.PI) {
                        dAngle = Math.PI*2 + dAngle;
                }
                if(speed < 0) {
                        //Выполняется только при движении назад
                        //Ограничение на поворот и торможение из-за прицепа
                        if(dAngle >= trailerRotLimit) {
                                aRad = masterRotRad - trailerRotLimit;
                                speed *= .8;
                        } else if(dAngle <= -trailerRotLimit) {
                                aRad = masterRotRad + trailerRotLimit;
                                speed *= .8;
                        }
 
                        //Обратная связь на машину в результате торможения
                        //Коэффициенты .5 и 3 подбираются вручную
                        if(dAngle >= trailerRotLimit * .5) {
                                master.rotation += speed / speedLimit * 3;
                        } else if(dAngle <= -trailerRotLimit * .5) {
                                master.rotation -= speed / speedLimit * 3;
                        }
                }
 
                //Убираем паразитную скорость (погрешность округления чисел)
                if(Math.abs(speed) < speedStep && !pressDown) {
                        speed = 0;
                }
 
                //Поворачиваем прицеп к машине
                var a = aRad / Math.PI * 180;
                slave.rotation = a;
 
                //Пододвигаем прицеп чтобы была стыковка
                slave.x = masterDot.x - Math.cos(aRad) * slave.dotIn.x;
                slave.y = masterDot.y - Math.sin(aRad) * slave.dotIn.x;
        }
}
 
 
        startl1();

Помогите плиз разобраться с функцией correctTrailer(slave, master),может даже кто подправить может.Если трейсю trace(slave);либо master в моем случае то получается и другой [object MovieClip].Ну и конечно же как только начинаю движение получаю результат:
TypeError: Error #1010: A term is undefined and has no properties.
at bigtruck/correctTrailer()
at bigtruck/corektirovka()

Все мозги уже себе запарил,собственными силами разобраться не получается.Большое спасибо.С уважением Андрей.

Dukobpa3 01.05.2011 20:34

Цитата:

Код AS3:

          function startl1():void{
 
                car.addEventListener(Event.ENTER_FRAME, ModifyCar);       
 
                                stage.addEventListener(Event.ENTER_FRAME,corektirovka);
                  }


Вот это бред, в данном конкретном случае гораздо проще сделать одну подписку на энтерфрейм на стедж и не париться.

Цитата:

Код AS3:

                var masterDot={x:master.dotOut.x, y:master.dotOut.y};
 
                master.localToGlobal(masterDot);
                globalToLocal(masterDot);


Вот здесь masterDot должен иметь вполне конкретный тип Point, а не призрачный Object.

Глубже вникать не стал. С таким форматированием ас3 кода глаза сломать стремно.

Трейсы твои адекватные выдает, у тя трейлер и машина мувиклипы и есть насколько я понимаю. А то что какой-то там терм андефайнед, так было бы неплохо знать какой именно терм, а то по этому куску кода сложно сказать что там у тя андефайнед.

Andrej 01.05.2011 22:32

Конкретно ошибка такова
 
Вложений: 1
TypeError: Error #1034: Type Coercion failed: cannot convert Object@11117331 to flash.geom.Point.
at truckas3_fla::MainTimeline/correctTrailer()
at truckas3_fla::MainTimeline/corektirovka()

строка : master.localToGlobal(masterDot);

Я вложил 2 файла .fla Один в AS2 второй в AS3 может так проще понять будет.

Dukobpa3 01.05.2011 22:37

Прочел бы ответ мой сначала внимательно;)

Цитата:

Вот здесь masterDot должен иметь вполне конкретный тип Point, а не призрачный Object.
И не знаю как кто, а я бы за нетипизированне переменные руки отрывал ;)

Добавлено через 6 минут
поменяй вот это:
Код AS3:

var masterDot={x:master.dotOut.x, y:master.dotOut.y};

на вот это:
Код AS3:

var masterDot:Point = new Point(master.dotOut.x, master.dotOut.y);

Будет без той ошибки о которой ты спрашиваешь. А глюки с координатами кузова сам исправляй, а то машина ездит а кузов отрывается и улетает куда-то...

Добавлено через 13 минут
Блин, всё-таки не сдержался)))

Менй вот этот блок целиком:
Код AS3:

var masterDot={x:master.dotOut.x, y:master.dotOut.y};
 
master.localToGlobal(masterDot);
globalToLocal(masterDot);

На вот этот:
Код AS3:

var masterDot:Point = new Point(master.dotOut.x, master.dotOut.y);
 
masterDot = master.localToGlobal(masterDot);
masterDot = globalToLocal(masterDot);

И было бы неплохо хоть литературку подчитать о тех методах которые используешь. localToGlobal/globalToLocal в ас3 работают немного не так как в ас2.

Andrej 01.05.2011 23:48

Привет.Спасибо за ответ.НАсчет кузова,этя бы потом ковырял.А насчет поинта, я твой ответ видел,но вот просто напроста пока не проходил :)Да читаю я читаю потихоньку.Только вот больше методом тыка вечно почемуто,да терпения маловато...Спасибо еще раз.Добавил тебе хороший отзыв :)


Часовой пояс GMT +4, время: 04:41.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.