Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Нужно хитрое обращение к parent (http://www.flasher.ru/forum/showthread.php?t=115622)

tananuka 04.09.2008 19:23

Нужно хитрое обращение к parent
 
Вложений: 1
Делаю первую игру на ас3
(йа креветко, прошу простить за глупость моего измышления)

Нужно обратиться к методу папы-мувиклипа, но что-то не получается...
:rtfm:
папа-клип:
Код:

package {
        import flash.display.MovieClip;

        public class Menu extends MovieClip {
                public function Menu() {
                }
                public function onPlay_menu():void {
                        trace("сына папу напрягает")
                }
               
        }
}

сына-клип:
Код:

package {
        import flash.display.MovieClip;
        import flash.events.*;

        public class Btn_play extends MovieClip {
                public function Btn_play() {
                        addEventListener(MouseEvent.MOUSE_DOWN, onPressed);
                }
                private function onPressed(evt : Event):void {
                        parent.onPlay_menu(); //- вот оно!!!!!!!!!!!!!!!!
                }
        }
}

+вопросы по исходнику:
  • когда ложешь слой-маску на слой с текстом, текст не отображается, почему, как быть?
  • когда текст движется(мотином твином) то лезут пикселы, где антиалайзинг? как его настроить?

Rzer 04.09.2008 19:46

1) Menu(parent).onPlay_menu(); или parent["onPlay_menu"]();
2) выбираешь текст под маской и два раза жмешь ctrl+b
3) антиалайзинг только для внедряемых шрифтов

tananuka 04.09.2008 20:08

а без контрол+Б? по чему так только?
я вроде шрифт внедрял... или обьясните как ето сделать..

а чойто за конструкция такая КЛАСС(parent).метод()
откуда взял такое исполнение, обьясните пожалуйста логику етого, тоесть понятно мы приводи к типу Маин, хотя как так? ведь етот класс не импортирован в нашем классе-сыне

kackbip 04.09.2008 20:46

1) Входящий параметр метода onPressed у вас не того типа. Там должно быть не Event, а кое что другое ;) Хелп в помощь
2) parent.onPlay_menu(); С этой строкой компилятор будет ругаться.
Можно заменить ее на parent["onPlay_menu"]()
Либо в Publish Settings - > Settings убрать галку со Strict Mode

etc 05.09.2008 00:05

Цитата:

Сообщение от kackbip (Сообщение 762357)
Можно заменить ее на parent["onPlay_menu"]()
Либо в Publish Settings - > Settings убрать галку со Strict Mode

Это не советы, а медвежьи услуги.
Вариант с кастом, приведенный во втором посте, в принципе, пойдёт. Только с оператором as, а не как написано. А вообще, ребенок не должен вызывать методы родителя, никаких «сына папу напрягает», необходимо написать новое событие и высылать его по окончании проигрывания.

tananuka 05.09.2008 16:32

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

что то не пойму
как в одном классе можно поймать событие другого?
вот класс события:
Код:

class CustomDispatcher extends EventDispatcher {
          public static var ACTION:String = "action";
   
          public function doAction():void {
              dispatchEvent(new Event(CustomDispatcher.ACTION));
          }
    }

я беру его и импортирую в свой сына класс(вложеный мувик)
пишу там:
Код:

var dispatcher:CustomDispatcher = new CustomDispatcher();

private function onPressed(evt : MouseEvent):void {
          dispatcher.doAction();
          }

и как терь поймать это событие, если событие генерирует вложеный мувик, а поймать должен его контейнер мувик?

Molecula 05.09.2008 16:40

Сына подпишите:
Код:

addEventListener(CustomDispatcher.ACTION, myFunc);

etc 05.09.2008 16:52

Ну например:
Код:

package {
        import flash.display.MovieClip;
        import flash.events.*;

        public class Menu extends MovieClip {

                public function Menu() {
                        super();
                        super.addEventListener(Event.COMPLETE, this.handler_complete);
                }

                private function handler_complete(event:Event):void {
                        trace("сына папу напрягает")
                }
               
        }
}

Код:

package {
        import flash.display.MovieClip;
        import flash.events.*;

        public class PlayButton extends MovieClip {

                public function PlayButton() {
                        super();
                        super.addEventListener(MouseEvent.MOUSE_DOWN, this.handler_mouseDown);
                }

                private function handler_mouseDown(event: Event):void {
                        super.dispatchEvent(new Event(Event.COMPLETE, true));
                }
        }
}


tananuka 05.09.2008 17:34

сработало... чудо, чудо... но над почитать что ето за супер() - пупер и как оно все так сработало...
а что ето за параметр второй в диспатче, для чего? super.dispatchEvent(new Event(Event.COMPLETE, true));

и как быть если бы все таки написал своё событие(CustomDispatcher), тот этот класс нужно было импортить куда: в Menu ? и в PlayButton ?

и у меня в реальности может быть несколько вложеных клипов и каждый со временем передает вверх событие, поэтому нужно придумать разные эвенты, иначе самый верхний мувиклип сразу услышит самый нижний, а надо через определенное время средним клипом!!!

etc 05.09.2008 17:38

В оба класса.

А вообще, почитайте про событийную модель в ActionScript 3 при работе с DisplayObject-ами. Тогда и вопросов, что за true в конструкторе Event. super() — вызов конструктора супер-класса, он, конечно, в любом случае будет вызван, но опускать вызов — плохой тон.

tananuka 05.09.2008 18:45

где можно почитать про событийную модель в ActionScript 3 на русском?? (яндекс, гугл не помогли)

etc 05.09.2008 18:47

Открыть хелп, например.

tananuka 05.09.2008 20:07

еще почитал, и терь вижу что пузырьки!!!! могут сделать все что надо!!!
и как я понял супер() - вообще не нужен для пузырьков(ИМХО)
может я коечно ошибаюсь и не правильно понимаю ету статью :
http://riapriority.com/blogs/constantiner.php/c16/
но у меня все работает и без супер()

BlooDHounD 05.09.2008 20:18

tananuka, "супер" это совершенно другая опера. Вам по-моему это слегка выше уже написали, но, кажется, у Вас пелена перед глазами ... жаль ...

tananuka 05.09.2008 20:48

блудхунд, а мне как... но ничё, всему своё время... но как вы чётко про пелену, только размышлял над этим... какие не были учебники, каждому открывается по разному... но ето уже другая мозила))))

vvk80 06.09.2008 01:01

Цитата:

Сообщение от __etc (Сообщение 762380)
Это не советы, а медвежьи услуги.
Вариант с кастом, приведенный во втором посте, в принципе, пойдёт. Только с оператором as, а не как написано. А вообще, ребенок не должен вызывать методы родителя, никаких «сына папу напрягает», необходимо написать новое событие и высылать его по окончании проигрывания.

Может быть я не в тему, но представим следующую ситуацию:
папа загружает ребенка, в котором содержится меню. По клику какого-либо из айтемов меню ребенка папа должен что-либо сделать... Я сделал это через LocalConnection и передаю папе идентификатор того айтема который был кликнут. В итоге как раз получается что "сына папу напрягает"... Может быть я что-то не так деляю???
Просьба объяснить, как правильно... :rolleyes:
Заранее спасибо!

P.S. и еще я тут прочитал про пузырьки... блин не сразу понял что это bubbling... да писать на русском такие вещи...

Яски 06.09.2008 01:16

Цитата:

Сообщение от vvk80 (Сообщение 762680)
Может быть я не в тему, но представим следующую ситуацию:

У вас папа лишний. Меню и само может выполнять необходимые действия.

etc 06.09.2008 02:08

Цитата:

Сообщение от vvk80 (Сообщение 762680)
Может быть я не в тему, но представим следующую ситуацию:
папа загружает ребенка, в котором содержится меню. По клику какого-либо из айтемов меню ребенка папа должен что-либо сделать... Я сделал это через LocalConnection и передаю папе идентификатор того айтема который был кликнут. В итоге как раз получается что "сына папу напрягает"...

LocalConnection тут нафиг не нужен, достаточно всё того же бабблинга.

vvk80 07.09.2008 23:10

Цитата:

Сообщение от __etc (Сообщение 762692)
LocalConnection тут нафиг не нужен, достаточно всё того же бабблинга.

у меня меню в отдельном swf, оно появляется один раз при запуске и потом исчезает, AIR пишет [UNLOAD SWF], так оно мне и надо... в итоге я не нашел друго способа, чтобы передать парметр из этой swf в родительскую...


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

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