Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Вопросы по stage (http://www.flasher.ru/forum/showthread.php?t=160336)

Castro 11.07.2011 17:42

Вопросы по stage
 
От нефига делать (и от желания отточить скил) начал писать казуальную игрушкку типа "Танчики"
Итак, есть базовый класс WarMachine - это шаблон танка, при клике на стейдж внутри этого класса генерится объект типа Boolet, пуля которая меняет коородинаты на EnterFrame, и аттачится на главный стейдж.
Посему вопросы:
1) Щас лиснер на клик аттачится на стейдже (выстрел). Можно ли зааттачить его внутри самого WarMachine? Пробовал через root.stage - не помогло
2) На стейдже лежит мувик booletContainer, в который надо складывать пули. Как к нему добратся их WarMachine?
root.stage.addChild(b) работает, а root.stage.booletContainer.addChild(b) - нет
3) Сделал выстрел по нажатию пробела, тот способ что и с управлением через булевы переменные, где управление стрелками реализовано. Оно конечно работает, но поскольку висит на EnterFrame то пули вылетают пачками и надо очень коротко нажимать. Можно как-то это сделать попроще обрабатывать и назначать как с тем же Mouse Click?

RaVeN-Nikma 11.07.2011 18:20

1) В базовом классе WarMachine, создайте статичную переменную и при инициализации главного класс присвойте в эту статичную переменную ссылку на stage, и потом из любого класса сможете обратиться к stage.

Код AS3:

public static var STAGE:Stage;
public function WarMachine():void
{
        if (stage) init();
        else addEventListener(Event.ADDED_TO_STAGE, init);
}
 
private function init(e:Event = null):void
{
STAGE = this.stage
}

Потом в Любом классе пишите
Код AS3:

WarMachine.STAGE.addEventListener(MouseEvent.CLICK, doSomething)


-De- 11.07.2011 18:26

1) да. У каждого display object'a, находящегося на сцене есть stage (код выше решает эту проблему симпатичнее, кстати, рекомендую).
2) Как-то передать WarMachine ссылку на booletContainer (bullet - правильно). Ну или дать возможность её достать =) Думаю передача параметром в конструктор тут - не криво совсем.
3) Ну можно на KEY_DOWN повесить. Можно смотреть, сколько с прошлого выстрела прошло. Как пан пожелает)
PS: танчики - неказуальны. Казуалки на казуальных порталах и флешки на флеш порталах - разные вещи. Чисто терминологическая поправка %)

RaVeN-Nikma 11.07.2011 18:27

2) Зависит от того как booletContainer добавляется на stage. Если через addChild, то дайте этому контейнеру name = "booletContainer" и обращайтесь к нему

Код AS3:

root.stage.getChildByName("booletContainer")


-De- 11.07.2011 18:37

Если для точения скилла, а не быстро накидать, посмотреть и забыть, то про getChildByName - забыть.

RaVeN-Nikma 11.07.2011 18:41

Если контейнер один и добавляется всего раз на сцену, то просто запомните ссылку и обращайтесь через нее, можно даже сделать ее статичной (смотрите пример выше)

-De- - ну ты критикан =)

etc 11.07.2011 19:25

Цитата:

Сообщение от -De- (Сообщение 1010746)
Если для точения скилла, а не быстро накидать, посмотреть и забыть, то про getChildByName - забыть.

Сам по себе getChildByName не вреден. Вреден он в конкретно данном случае, но менее вреден, чем вариант со статическим stage.

RaVeN-Nikma 11.07.2011 19:28

Чем вреден статический Stage?

избавляет от множества проблем во внутренних классах, если надо вешать лисенеры MouseEvent (как бонус)

etc 11.07.2011 19:32

Цитата:

Сообщение от RaVeN-Nikma (Сообщение 1010759)
Чем вреден статический Stage?

избавляет от множества проблем во внутренних классах, если надо вешать лисенеры MouseEvent (как бонус)

Ну и слушайте MouseEvent, когда вы находитесь на stage. Если не находитесь, нечего слушать.

RaVeN-Nikma 11.07.2011 19:54

Частая ситуация, делаешь скроллер и нужно отрабатывать stopDrag(); когда срабатывает событие MouseEvent.MOUSE_UP, нужен глобальный MOUSE_UP, а не над объектом

И все же Вы не объяснили чем плох статичный stage, кроме как то что он плох. Есть ли какие-нибудь причины почему так нельзя делать, не касающиеся стиля программирования.

П.С. Stage существует всегда, хранить поинтер на постоянно существующий объект признак грамотного программирования, я так считаю...


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

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