Форум 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() — вызов конструктора супер-класса, он, конечно, в любом случае будет вызван, но опускать вызов — плохой тон.


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

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