Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Вопрос по слушателю ENTER_FRAME (http://www.flasher.ru/forum/showthread.php?t=144962)

randomnoob 26.09.2010 05:35

Вопрос по слушателю ENTER_FRAME
 
Привет.
Хотел задать вопрос в нубской теме, но она закрыта, поэтому спрашиваю здесь.

Начал читать книгу Foundation ActionScript 3.0 Animation: Making Things Move!. После третьей главы решил потренироваться.

Хочу, чтобы выводилось вот что. При старте есть 2 шарика. Один постоянно двигается направо. При клике мышкой должен появляться еще шарик и лететь тоже направо.

Движение одного реализовал через хендлер
Код AS3:

private function onEnterFrame(event:Event):void{
ball1.x +=1;
}

Потом сделал хендлер для обработки клика.
Код AS3:

private function onMouseClick(event:MouseEvent):void{
var tmp:Ball = new Ball(5, 0xFF0000);
addChild(tmp);
tmp.x = 50;
tmp.y = 50;
for(var i:int = 51; i < 500; i++){
tmp.x = i;
}

После запуска шарик по клику оказывался сразу справа, без движения. Почесав репу, я понял, что это из-за того, что движение не отображается ибо действие происходит вне ENTER_FRAME.

Соответственно, вопрос.
Как сделать так, чтобы движение нового шарика отображалось?

f.g.programmer 26.09.2010 10:53

Судя по коду вы и не пытались начать двигать новый шарик. Изменение координат нового шарика должно происходить там же в onEnterFrame.
Это можно сделать заведя массив или вектор шариков и обновлять их в onEnterFrame, или регистрировать обработчик ENTER_FRAME не для контейнера шариков, а для каждого шарика.
Пример второго способа

Код AS3:

private function onEnterFrame(event:Event):void {
        (event.target as Ball).x += 1;
}
private function onMouseClick(event:MouseEvent):void {
        var tmp:Ball = new Ball(5, 0xFF0000);
        addChild(tmp);
        tmp.x = 50;
        tmp.y = 50;
        tmp.addEventListener(Event.ENTER_FRAME, onEnterFrame);
}


randomnoob 26.09.2010 15:58

Спасибо, попробовал этот вариант. Только при дебаге выдает такую ошибку:
TypeError: Error #1009: Cannot access a property or method of a null object reference.
ссылаяь на строку
Код AS3:

(event.target as Ball).x += 1;

При этом, если закрыть билдер, то программа вроде как работает и шарики по клику посылаются.

TanaTiX 26.09.2010 16:08

Создайте массив, где будут храниться ваши шарики и в обработчике ENTER_FRAME изменяйте координаты каждого элемента (циклом for each). А при создании нового шарика добавляйте его в тот массив.

randomnoob 26.09.2010 16:37

Спасибо, получилось :)

f.g.programmer 26.09.2010 17:58

Цитата:

Сообщение от randomnoob (Сообщение 938588)
Спасибо, попробовал этот вариант. Только при дебаге выдает такую ошибку:
TypeError: Error #1009: Cannot access a property or method of a null object reference.

Ошибку выдаёт потому что где-то ещё добавлен слушатель не на Ball, и приведение к типу (event.target as Ball) даёт null.
Но вариант с массивом или вектором (если нет ограничения, чтобы работала в fp9) пожалуй лучше.


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

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