Форум 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.onMotionFinished не видно переменную из самого твина (http://www.flasher.ru/forum/showthread.php?t=139379)

hamstress 29.04.2010 14:53

в Tween.onMotionFinished не видно переменную из самого твина
 
Код класса (AS2):

Код:

import mx.transitions.Tween;
import mx.transitions.easing.*;

class Character {

        var currMc:MovieClip;
        var beginScale:Number;
        var TweenX:Tween;

        function Character(mc:MovieClip,x:Number, y:Number, scale:Number) {
                currMc = mc;
                trace("currMc: "+currMc);
                currMc._x = x;
                currMc._y = y;
                beginScale = scale;
                currMc._xscale = currMc._yscale=beginScale;
                inTweens();
        }

        function inTweens() {
                TweenX = new Tween(currMc, "_x", None.easeNone, currMc._x, currMc._x+40, 2, true);
                TweenX.onMotionFinished = function() {
                        trace("currMc: "+currMc);
                };
        }
}

Экземпляр:

Код:

this.createEmptyMovieClip("characters_mc",this.getNextHighestDepth());
characters_mc.attachMovie("smokeFish","smokeFish",characters_mc.getNextHighestDepth());
var fish:Character = new Character(characters_mc.smokeFish,200, 200, 100);

в последнем
Код:

trace("currMc: "+currMc);
в коде класса выводит undefined, хотя твин первый раз срабатывает корректно.

Не могу понять почему.
если писать просто без класса. напрямую указывая MovieClip, к которому применяется Tween, работает корректно

Спасибо

in4core 29.04.2010 20:51

Я тему все не прочел. Но по классу вы должны использовать Делегат чтобы было видно CurMc
Код AS1/AS2:

import mx.transitions.Tween;
import mx.transitions.easing.*;
 
class Character {
 
        var currMc:MovieClip;
        var beginScale:Number;
        var TweenX:Tween;
 
        function Character(mc:MovieClip,x:Number, y:Number, scale:Number) {
                currMc = mc;
                trace("currMc: "+currMc);
                currMc._x = x;
                currMc._y = y;
                beginScale = scale;
                currMc._xscale = currMc._yscale=beginScale;
                setTimeOut(mx.utils.Delegate.create(this,inTweens),10);
        }
 
        function inTweens() {
                TweenX = new Tween(currMc, "_x", None.easeNone, currMc._x, currMc._x+40, 2, true);
                TweenX.onMotionFinished = function() {
                        trace("currMc: "+currMc);
                };
        }
}

Не обещаю что прокатит, просто я не помню как подгружать делагт класс без всего

udaaff 29.04.2010 21:01

Код AS1/AS2:

import mx.transitions.Tween;
import mx.transitions.easing.*;
import mx.utils.Delegate;
 
class Character
{
 
        private var currMc:MovieClip;
        private var beginScale:Number;
        private var tweenX:Tween;
 
        public function Character(mc:MovieClip, x:Number, y:Number, scale:Number)
        {
                currMc = mc;
                trace("currMc: " + currMc);
                currMc._x = x;
                currMc._y = y;
                beginScale = scale;
                currMc._xscale = beginScale;
                currMc._yscale = beginScale;
                inTweens();
        }
 
        private function inTweens():Void
        {
                tweenX = new Tween(currMc, "_x", None.easeNone, currMc._x, currMc._x + 40, 2, true);
                tweenX.onMotionFinished = Delegate.create(this, onMotionFinishedHandler);
        }
 
        private function onMotionFinishedHandler():Void
        {
                trace("currMc: " + currMc);
        }
}


in4core 29.04.2010 21:54

Во удаф это все понятно! А как запустит делагат подругому можно? Типа просто mx.utils.Delegate.create(this,f) разве нельзя ? Или тока сославшись на новую функцию, от внтурненнй можно?

udaaff 29.04.2010 22:02

Цитата:

Типа просто mx.utils.Delegate.create(this,f) разве нельзя ?
Можно и так конечно. Просто полное имя класса обычно пишется для того, чтобы точно указать на класс, например, когда существует еще один класс с таким же именем, но в другом пакете.
Цитата:

Или тока сославшись на новую функцию, от внтурненнй можно?
Этот вопрос не понял.

in4core 30.04.2010 00:28

Не !
Ты не понял. Я имел ввиду другой вопрос

Код AS1/AS2:

public function Character(mc:MovieClip, x:Number, y:Number, scale:Number)
        {
                currMc = mc;
                trace("currMc: " + currMc);
                currMc._x = x;
                currMc._y = y;
                beginScale = scale;
                currMc._xscale = beginScale;
                currMc._yscale = beginScale;
                mx.utils.Delegate.create(this,inTweens);
        }

Вот что я имел ввиду, как таким образом можно запустить!

udaaff 30.04.2010 00:36

Тут без разницы, что с делегатом, что без делегата, метод inTweens() вызывается в области видимости объекта Character. А вложенная функция вызывается в области видимости TweenX, поэтому и currMc flash ищет в TweenX. Поэтому не годится такой вариант.

in4core 30.04.2010 01:27

Ну вот именно это я и спрашивал, как типа такое сделать можно без родительской функции

hamstress 04.05.2010 16:23

Спасибо огромное.
Сама бы не нашла ответ :)


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

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