Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   AS3, как самоудаляться и запускать при этом метод из основного класса (http://www.flasher.ru/forum/showthread.php?t=133488)

gloomyBrain 07.12.2009 18:19

Цитата:

не известен точный кадр их окончания
Цитата:

+ анимация может быть перерисована и длительность увеличится => изменится номер последнего кадра
Ответ:
Код AS3:

animation.totalFrames-1

Цитата:

не удобен если на одной таймлайн находится несколько анимаций
Чем? Тем, что каждой надо добавить листенер для события ENTER_FRAME? Этого можно не делать, если воспользоваться функцией
Код AS3:

addFrameScript(номер кадра, имя функции)

Но по сути это то же самое, что написать код в кадре =)

Jewelz 07.12.2009 18:50

Код AS3:

animation.totalFrames-1

это если одна анимация, я писал про несколько: у одной конец в 23 кадре, у другой в 101, у третьей в 115

Цитата:

Сообщение от gloomyBrain (Сообщение 870849)
Чем? Тем, что каждой надо добавить листенер для события ENTER_FRAME?

да, этим

Цитата:

Сообщение от gloomyBrain (Сообщение 870849)
Этого можно не делать, если воспользоваться функцией
Код AS3:

addFrameScript(номер кадра, имя функции)


и когда я изменяю одну из 10 анимаций в IDE - я должен поменять константу с концом анимации в коде, по-идее правильный способ, но он мне не нравится тем, что мне нужно следить за всеми этими изменениями, + если графику делаю не я, то мне нужно при каждом изменении проверять "концы", ИМХО проще в конце отсылать событие и я точно буду уверен что какая бы анимация не была я всегда узнаю об ее окончании

Код AS3:

Но по сути это то же самое, что написать код в кадре =)

по сути да, но на деле - нет, так как весь код все-таки хранится в одном месте и при разработке к примеру во FD, ты видишь что и где написано, но опять в моем случае я считаю лучше в кадрах ;)

gloomyBrain 07.12.2009 19:15

Цитата:

это если одна анимация, я писал про несколько: у одной конец в 23 кадре, у другой в 101, у третьей в 115
Хорошо, Jewelz, ответьте на вопрос, что такое totalFrames?

etc 07.12.2009 21:19

gloomyBrain, имеются ввиду вложенные анимации.

gloomyBrain 07.12.2009 22:08

А разве это что-нибудь поменяет?

etc 08.12.2009 09:56

Цитата:

Сообщение от gloomyBrain (Сообщение 870902)
А разве это что-нибудь поменяет?

Кардинально.

dimarik 08.12.2009 11:50

А если пробежаться по дереву и навесить addFrameScript каждому ребенку, имеющему totalFrames > 1 или еще по каким-нибудь признакам? Все это дело завернуть в класс, который укажете в качестве base-класса в linkage, можно даже jsfl'ом, и скомпилить им сразу.

__ant 08.12.2009 12:03

Цитата:

и когда я изменяю одну из 10 анимаций в IDE - я должен поменять константу с концом анимации в коде, по-идее правильный способ, но он мне не нравится тем, что мне нужно следить за всеми этими изменениями, + если графику делаю не я, то мне нужно при каждом изменении проверять "концы", ИМХО проще в конце отсылать событие и я точно буду уверен что какая бы анимация не была я всегда узнаю об ее окончании
Я бы расставил метки в кадрах, использовал бы currentLabels и addFrameScript.

Код в кадрах это плохо.

dimarik 08.12.2009 12:07

Храните каждую логически законченную анимацию в отдельном библиотечном символе символе.

Котяра 08.12.2009 13:04

Цитата:

Сообщение от Jewelz (Сообщение 870864)
Код AS3:

animation.totalFrames-1

это если одна анимация, я писал про несколько: у одной конец в 23 кадре, у другой в 101, у третьей в 115
и когда я изменяю одну из 10 анимаций в IDE - я должен поменять константу с концом анимации в коде,

когда поменяешь длину анимации, её totalFrame изменится.
для 10 анимаций делаешь массив анимаций, можно сделать именованный хэш список
Код AS3:

// массив анимаций
public var animationArray:Array =[] /*of MovieClip*/
private var _currentAnimation:MovieClip;
 
// здесь по логике запускаем необходимую анимацию
public function game():void
{
//.........
// запускаем нужный клип
playAnimation(animationArray[8]);
 
//........
}
 
public function playAnimation(animation:MovieClip):void
{
_currentAnimation = animation;
animation.addFrameScript(animation.totalFrame-1, endPlaying);
animation.play();
}
 
public function endPlaying():void
{
_currentAnimation.stop();
// если надо то диспатчим событие, хотя мы уже в хэндлере события
}

плюс в том что существует одна единственная ф-ция для конца анимации и не надо код писать в кадрах вообще.
минус в том что неизвестен currentTarget и анимации запускаются строго по одной

ЗЫ: смотрим тонкости
Код AS3:

package
{
 
public class Delegate
{
  public static function create(handler:Function,...args):Function
  {
    return function(...innerArgs):void
    {
      handler.apply(this,innerArgs.concat(args));
    }
  }
 }
}


//Теперь мы можем вызывать нашу функцию с параметрами:

Код AS3:

package {
 
 import flash.display.*;
 
 public class main extends Sprite {
 
 
  public function main() {
//...
  }
 
// массив анимаций  - заполняется отдельным методом - здесь не указан..
public var animationArray:Array =[] /*of MovieClip*/
 
// здесь по логике запускаем необходимую анимацию
public function game():void
{
//.........
// запускаем нужный клип
playAnimation(8);
 
//........
}
 
public function playAnimation(ind:int):void
{
var animation:MovieClip = animationArray[ind] as MovieClip;
animation.addFrameScript(animation.totalFrame-1, Delegate.create(endPlaying,ind));
animation.play();
}
 
public function endPlaying(ind:int):void
{
var animation:MovieClip = animationArray[ind] as MovieClip;
animation.stop();
trace(ind);
// если надо то диспатчим событие, хотя мы уже в хэндлере события
}
}



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

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