Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Не работает Tween внутри своего класса (http://www.flasher.ru/forum/showthread.php?t=116926)

nikitakozin 14.10.2008 15:28

Не работает Tween внутри своего класса
 
Есть вот такой вот ролик:
http://chinacars.ru/img/des/visual.swf

Сейчас мне нужно добавить в него ещё одну машины и я хочу его переписать, чтобы анимация была программная. Например, чтобы автобус без торможения в середине пути ездил из одной крайней точки до другой.

Я написал свой класс, но по непонятной мне причине не работает Tween.

Car.as
Код:

import mx.transitions.*;
import mx.transitions.easing.*;
       
class Car {

        public static var iMotionSteps = 50;
        private static var _frame = 0;


        private var bInMotion = false;
        private var sDirection = null;
        private var eObject = null;
        private var oTween = null;
        private var oTweenCounter = null;
        private var iHomeX = 0;
        private var iForwardX = 0;
        private var iBackwardX = 0;

        public function Car( _mc:MovieClip, _iHomeX, _iForwardX, _iBackwardX, _iMotionSteps ){
                eObject = _mc;
                iHomeX = _iHomeX;
                iForwardX = _iForwardX;
                iBackwardX = _iBackwardX;
                iMotionSteps = _iMotionSteps;
                oTween = new mx.transitions.Tween( eObject, '_x', mx.transitions.easing.Regular.easeInOut, eObject._x, eObject._x, 1);
        }

        public function Forward(){
                this.sDirection = 'Forward';
                this._Go( iForwardX );
        }

        public function Backward(){
                this.sDirection = 'Backward';
                this._Go( iBackwardX );
        }

        public function Home(){
                this.sDirection = 'Home';
                this._Go( iHomeX );
        }

        private function _Go( iX ){
                trace( sDirection + ', ' + bInMotion + ', ' + iX );
                if( !bInMotion ){
                        bInMotion = true;
                        oTween = new mx.transitions.Tween(eObject, '_x', mx.transitions.easing.Regular.easeInOut, eObject._x, iX, iMotionSteps);
                        oTweenCounter = new mx.transitions.Tween(eObject, '_frame', null, 0, iMotionSteps, iMotionSteps);
                        oTween.onMotionFinished = function(){
                                bInMotion = false;
                        }
                        oTweenCounter.onMotionFinished = function(){
                                eObject._frame = 0;
                        }
                        eObject.gotoAndPlay( 'Start' );
                } else {
                        oTween.onMotionFinished = function(){
                                bInMotion = false;
                                switch( sDirection ){
                                        case 'Forward': Forward(); break;
                                        case 'Backward': Backward(); break;
                                        case 'Home': Home(); break;
                                }
                        }
                }
        }

}

И в основном ролике:
Код:

import Car.as;

var oBus:Car = new Car( Bus, 150, 350, -100 );

На сцене уже расположен клип с именем Bus.
Почему-то не происходит Tween и, соответственно, не срабатывает Tween.onMotionFinished (

P.S. С классами во флеше первый раз работаю :rolleyes:

iNils 14.10.2008 16:14

Код:

oTween = new Tween( eObject, '_x', Regular.easeInOut, eObject._x, eObject._x, 1);
откуда докуда?

nikitakozin 14.10.2008 19:29

За один кадр никуда не двигаться. Сначала сделал, потом убрал. Думал как с блюром — сначала создать объект, а потом менять его свойства только, но не разобрался ещё толком тогда. В итоге убрал, но остальное-то всё равно не работает. Как показали опыты iMotionSteps почему-то undefined, но почему я так и не понял, по логике вроде должна быть 50.

Ооо, я кажется понял в чём дело — я же его при создании объекта класса переопределяю, но не передаю в конструктор класса, вот и получается — undefined. Завтра на работу приду попробую, надеюсь, что всё получится :-)

iNils 14.10.2008 19:38

Мультипостинг у нас запрещен.

nikitakozin 15.10.2008 10:04

Разобрался с присваиванием параметра, немного доработал:

Код:

import mx.transitions.*;
import mx.transitions.easing.*;
       
class Car {

        private var bInMotion = false;
        private var sDirection = null;
        private var eObject = null;
        private var oTween = null;
        private var iHomeX = 0;
        private var iForwardX = 0;
        private var iBackwardX = 0;
        private var iMotionSteps = 50;

        public function Car( _mc:MovieClip, _iHomeX, _iForwardX, _iBackwardX, _iMotionSteps ){
                eObject = _mc;
                iHomeX = _iHomeX;
                iForwardX = _iForwardX;
                iBackwardX = _iBackwardX;
                if( _iMotionSteps ){
                        iMotionSteps = _iMotionSteps;
                }
        }

        public function Forward(){
                sDirection = 'Forward';
                this._Go( iForwardX );
        }

        public function Backward(){
                this.sDirection = 'Backward';
                this._Go( iBackwardX );
        }

        public function Home(){
                this.sDirection = 'Home';
                this._Go( iHomeX );
        }

        private function _Go( iX ){
                var _iCurrentFrame = 0;
                if( !bInMotion ){
                        bInMotion = true;
                        oTween = new mx.transitions.Tween( eObject, '_x', mx.transitions.easing.Regular.easeInOut, eObject._x, iX, iMotionSteps );
                        oTween.onMotionChanged = function(){
                                _iCurrentFrame++;
                        }
                        oTween.onMotionFinished = function(){
                                bInMotion = false;
                                _iCurrentFrame = 0;
                        }
                        eObject.gotoAndPlay( 'Start' );
                } else {
                        oTween.onMotionFinished = function(){
                                bInMotion = false;
                                switch( sDirection ){
                                        case 'Forward': Forward(); break;
                                        case 'Backward': Backward(); break;
                                        case 'Home': Home(); break;
                                }
                        }
                }
        }

}

Теперь возник вопрос вот в этом куске кода:
Код:

                        oTween.onMotionFinished = function(){
                                bInMotion = false;
                                _iCurrentFrame = 0;
                        }

Проблема в изменении значения свойства класса — bInMotion, внутри функции переменную могу изменить, а записать значение в свойства класса не получается (

dimarik 15.10.2008 10:14

Используйте Delegate или self-reference ссылку app на объект класса, например:
Код:

class Car {
        private var _bInMotion:Boolean = false;

        // Skipped

        private function go(iX:Number):Void {
                var app:                Car = this;
                var iCurrentFrame:        Number;

                // Skipped

                oTween.onMotionFinished = function():Void{
                        app._bInMotion = false;
                        iCurrentFrame = 0;
                };
        }
}


nikitakozin 15.10.2008 12:51

Спасибо, dimarik.

Решил вынести разные машины в разные swf и подгружать их тоже в классе, получилось так:

Код:

        public function Car( _Name:String, _iHomeX:Number, _iForwardX:Number, _iBackwardX:Number, _iMotionSteps:Number ){
                trace( '=' + arguments[0] + '=' + _Name + '=' );
                mObject = _root.createEmptyMovieClip( _Name, _root.getNextHighestDepth() );
                loadMovie( _Name + 'swf', mObject );
                …
        }

Вот так создаю:
Код:

var oBus:Car = new Car( 'Bus', 100, 350, -100 );
Почему-то выводит: «=Bus==», т.е. если обращаться по имени к параметру, то возвращает пустую строку. Ну, и мувик, соответственно, не грузит.


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

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