Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Ошибки Мука. Не работает stop(). (http://www.flasher.ru/forum/showthread.php?t=202309)

Fogflasher 09.07.2013 12:22

Ошибки Мука. Не работает stop().
 
Всем привет.
Еще один базовый вопрос.

Читаю Мука, разбираю простейший пример из главы Programmatic Timeline Control.

Исходные данные:
Основной файл: Star_demo.fla.
В его библиотеке есть символ Star, и пять безымянных экземпляров на первом (и единственном) фрэйме.
К этому символу привязан файл Star.as содержащий програмную анимацию.

К Star_demo.fla привязан document class файл: Star_demo.as

Который содержит такой код:

Код AS3:

package
{
  import flash.display.MovieClip;
 
  public class Star_demo extends MovieClip
  {
                public function Star_demo ( )
                {
 
 
                        for (var i:int=0; i < numChildren; i++)
                        {
 
                          getChildAt(i).stop(); //1061: Call to a possibly undefined
                                              //method stop through a reference
                                            //with static type flash.display:DisplayObject.
 
                        }
 
 
                }
  }
}

И вот почему-то появляется такая ошибка. Хотя в книжке сказано, что все пучком должно быть.

Что не так? Вроде бы всё ОК, класс расширяет MovieClip, а значит и наследует его метод stop().

Причем, если эту строчку заменить на:
Код AS3:

trace(getChildAt(i).name);

То список экземпляров выдается, все ОК.
Свойство namе почему-то видно без проблем.

NoisyFlasher 09.07.2013 12:39

Как я разумею, метод getChildAt() возвращает вам DisplayObject, у которого нет метода stop(). А вот свойство name у него есть - поэтому и возвращается без проблем)

Вы же здесь обращаетесь к методу объекта, который вам возвращается, а не к методу вашего класса, в котором работаете:
Код AS3:

getChildAt(i).stop()

UPD: а вы в чем пишите - во Flash или в нормальной IDE? Возможно дело в этом - у Мука там пример приведен для Flash Professional. У меня сейчас нет возможности проверить, к сожалению. А, пардон - не увидел. В любом случае, попробую вечером дома)

Bletraut 09.07.2013 12:42

Код AS3:

(getChildAt(i) as MovieClip).stop()


Fogflasher 09.07.2013 12:59

NoisyFlasher, хм, про DisplayObject я как-то не подумал, весьма похоже что так.

Не, ну у меня тоже Adobe Flash CS3 Professional, хотя может его и не стоит считать нормальным IDE?
В чем кстати, оптимальнее всего работать, на ваш взгляд? Или это от задач зависит...

Bletraut, такой вариант ошибку не выдает, однако... анимация всё-равно продолжается.
Может так и должно быть? Видимо он делает stop() на один миг, но потом всё повторяется циклически...

NoisyFlasher 09.07.2013 13:29

Ну вот Bletraut показал верный путь, на мой взгляд - привести к MovieClip, а у того уже есть нужный метод.
Вообще, не стоит писать во Flash Professional - по-хорошему, его следует только для подготовки графики использовать. Ну или для каких-то мелких вещей - банер там нарисовать) Я начинал с Eclipse с плагином Flash Development Tools. FDT платный, но есть и бесплатная версия - мне, правда не понравилась. Сейчас пользуюсь Flash Develop (http://www.flashdevelop.org/). Он бесплатный, гибко настраиваемый - мне нравится.
А по поводу того, что анимация продолжается - может это из-за того, что она программно задана?.. Можно код файла Star.as?

belv 09.07.2013 13:33

Класс Star.as выложите. Метод stop(); останавливает анимацию если она будет сделана на временной шкале, а так как у вас анимация написана через код (я думаю использованы твины) , то stop(); не остановит.А ошибка может быть из-за того ,что star это не MovieClip а Sprite , а у спрайта метода stop(); нет.

Mareg 09.07.2013 13:55

Самый простой способ - через ссылку.

Код AS3:

package
{
  import flash.display.MovieClip;
 
  public class Star_demo extends MovieClip
  {
                public function Star_demo ( )
                {
 
 
                        for (var i:int=0; i < numChildren; i++)
                        {
 
                          var temp=MovieClip(getChildAt(i));
                          temp.stop();
                        }
 
 
                }
  }
}


Fogflasher 09.07.2013 14:19

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

belv, Нет, в библиотеке у Star тип MovieClip. Код выложен ниже.

Mareg, Это какой-то трюк "динамического программирования"?
Хотя, по-сути тут тоже идет приведение к типу МувиКлип, насколько я понимаю.

Код Star.as:
Код AS3:

package
{
          import flash.display.MovieClip;
          import flash.utils.Timer;
          import flash.events.TimerEvent;
 
          public class Star extends MovieClip
          {
                private var timer:Timer;
 
                public function Star ( )
                {
                  timer = new Timer(100, 0);
                  timer.addEventListener(TimerEvent.TIMER, timerListener);
                  timer.start( );
                }
 
                private function timerListener (e:TimerEvent):void
                {
                  randomFade( );
                }
 
                private function randomFade ( ):void
                {
 
                  alpha = Math.random();
 
                  var starscale:Number = Math.random() * 0.9;
 
                  scaleX = starscale;
                  scaleY = starscale;
 
                  x = 150 + 150 * Math.random();
                  y = 100 + 150 * Math.random();
                  rotation = Math.random() * 90;
 
                }
 
                public function dispose ( ):void
                {
                  timer.stop( );
                }
          }
}


belv 09.07.2013 14:41

Вот так у меня останавливает анимацию
var mc = getChildAt(i);
mc.dispose();

Mareg 09.07.2013 15:09

Собственно, да. mc.dispose(); Программная анимация и останавливается программно. Таймер, это не стандарт для MovieClip, он добавлен в дочернем классе. Можно конечно сделать таймер public переменной, и стопорить через mc.timer.stop(); , но инкапсуляцией будет правильней.

Я то подумал, что есть Мувклип созданный из-под IDE.

Насчет приема - это местная специфика, например можно код писать как и в AS2, через parent, только его нужно преобразовать в Object
Код AS3:

Object(parent).x+=10;

, хотя так лучше не делать, потому что это шикарнейший полигон для ошибок.


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

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