![]() |
|
||||||||||
|
|||||
|
[+1 02.09.15]
Регистрация: Mar 2009
Адрес: Moscow
Сообщений: 469
|
У меня есть три символа во флэш, все слинкованы с классами.Первые два расширяют класс MovieClip. Третий расширяет класс SimpleButton. Третий символ вложен во второй. На этапе выполнения первый символ создает экземпляр второго и вносит его в список отображения на сцену (ну и соответственно вместе с ним и вложенный в него символ). Таким образом, первый и второй символ находятся на одном уровне.
Вопрос: как из третьего символа-потомка SimpleButton, обратиться к методам второго символа-потомка MovieClip? Код класса первого символа: package { import flash.display.MovieClip; import flash.events.MouseEvent; import flash.events.Event; public class AlterBtn extends MovieClip { private var pressed:Boolean public var win:Win; public function AlterBtn () { buttonMode = true useHandCursor = true pressed = false stop (); addEventListener (MouseEvent.MOUSE_DOWN, downHandler); addEventListener (Event.ENTER_FRAME, checkPressed) } private function downHandler (e:MouseEvent):void { pressed = true win = new Win win.x = 90 win.y = 162.6 parent.addChild (win) gotoAndStop ("PRESS") } private function checkPressed (e:Event):void { if (pressed == true) { buttonMode = false useHandCursor = false removeEventListener (MouseEvent.MOUSE_DOWN, downHandler) } } } } package { import flash.display.MovieClip; import flash.events.Event; import flash.events.MouseEvent; public class Win extends MovieClip { public function Win () { } public function makeRew ():void { addEventListener (Event.ENTER_FRAME, goBack); } private function goBack (e:Event):void { prevFrame (); if (currentFrame == 1) { removeEventListener (Event.ENTER_FRAME, goBack) } } } } package { import flash.display.SimpleButton; import flash.events.MouseEvent; import flash.events.Event; public class CloseBtn extends SimpleButton { public function CloseBtn () { addEventListener (MouseEvent.MOUSE_DOWN, closeWin) } private function closeWin (e:MouseEvent):void { // parent.makeRew () не работает } } } Как правильно вызвать метод makeRew () из экземпляра класса Win? |
|
|||||
|
Modus ponens
|
1. не проверяйте переменные типа Boolean на равенство true | false они все равно ничему другому не могут быть равны. При дефолтных настройках флексового компилятора такой код не скомпилируется с предупреждением.
2. Вы можете каcтовать родителя к нужному типу, например: (parent as Win).makeRew(). Но это нехорошая практика - правильно в таком случае либо послать событие (на которое родитель, как и кто-либо другой могут подписаться), либо просто передать экземпляру класса CloseBtn ссылку на функцию, которую нужно вызвать. Второй вариант немного более экономичен по затратам, но первый более "ожидаемый" подход. Т.е. если кто-то будет использовать ваш класс, то в первую очередь будет искать возможность подписаться на событие, которое происходит когда в нем случается closeWin.
__________________
Hell is the possibility of sanity |
|
|||||
|
[+1 02.09.15]
Регистрация: Mar 2009
Адрес: Moscow
Сообщений: 469
|
Цитата:
Большое спасибо за ваш совет, теперь мой скрипт работает. Решил воспользоваться первым подходом, так как кроме меня кодом никто пользоваться не будет. Но когда все доделаю и буду модернизировать, обязательно перепишу все по второму подходу. Добавлено через 16 часов 45 минут Цитата:
До этого я писал код только в кадрах временной шкалы и обращался к экземплярам символов через instance name. Но щас решил все делать во внешних файлах и не совсем представляю, как один символ, линкованный с классом, может обращаться к другому симолу, линкованному с внешним файлом. Единственное че получается это первый написанный вами подход, но применить его получается не во всех случаях. Например AlterBtn находится на сцене, а CloseBtn вложен в Win. Через CloseBtn я могу обратиться к Win через parent, а вот как обратиться к AlterBtn? |
|
|||||
|
Modus ponens
|
SimpleButton уже расширяет EventDispatcher.
Объекты помещенные на сцену в ИДЕ - вобщем-то практически такие же, как и те, которые вы создаете используя возможности языка. Единственное, добираться до них действительно неудобно. Я так представляю, что после получения ссылки на root можно используя getChildAt() найти нужный объект, но вообще лучше все создавать либо в коде, либо уже все вытаскивать на таймлайн.
__________________
Hell is the possibility of sanity |
|
|||||
|
[+1 02.09.15]
Регистрация: Mar 2009
Адрес: Moscow
Сообщений: 469
|
И мой, надеюсь последний, вопрос.
Я зарегил событие в CloseBtn следующим образом, вот код: package { import flash.display.SimpleButton; import flash.events.MouseEvent; import flash.events.Event; public class CloseBtn extends SimpleButton { public static const WIN_CLOSED:String = "windowClosed"; public function CloseBtn () { addEventListener (MouseEvent.MOUSE_DOWN, closeWin) } private function closeWin (e:MouseEvent):void { (parent as Win).makeRew() dispatchEvent (new Event (CloseBtn.WIN_CLOSED)); } } } public class AlterBtn extends MovieClip { private var goBackStarted:Boolean; public var win:Win; public function AlterBtn () { buttonMode = true; useHandCursor = true; stop (); addEventListener (MouseEvent.MOUSE_DOWN, downHandler); addEventListener (CloseBtn.WIN_CLOSED, closeHandler); } private function downHandler (e:MouseEvent):void { gotoAndStop ("PRESS"); mouseEnabled = false; win = new Win; win.x = 90; win.y = 162.6; parent.addChild (win); } private function closeHandler (e:Event) { mouseEnabled = true; } } } |
|
|||||
|
в твоем раскладе AlterBtn никак не сможет сам выловить событие
во-первых, потому что оно должно быть для этого всплывающим и во вторых потому что CloseBtn лежит в соседней ветке дерева дисплейОбжектов и событие от него в AlterBtn никак не попадет.. можно подписаться у общего предка и вещать всплывающие событие public class AlterBtn extends MovieClip { public function AlterBtn () { root.addEventListener (CloseBtn.WIN_CLOSED, closeHandler); } private function closeHandler(e:Event) { trace( "AlterBtn.closeHandler > e : " + e ); } } public class CloseBtn extends SimpleButton { public static const WIN_CLOSED:String = "windowClosed"; public function CloseBtn () { addEventListener (MouseEvent.MOUSE_DOWN, closeWin) } private function closeWin (e:MouseEvent):void { dispatchEvent (new Event (CloseBtn.WIN_CLOSED, true)); } } можно подписываться в AlterBtn непосредственно у CloseBtn, но для этого тот должен иметь ссылку на него можно вещать в кнопке не от ее имени, а от имени какого-то статического диспатчера, который 'виден' отовсюду, ну и слушать соответственно его а не кнопку в общем, вариантов есть.., сказать что какой-то однозначно предпочтительнее, имхо, нельзя, в каждом конкретном случае все по разному |
|
|||||
|
[+1 02.09.15]
Регистрация: Mar 2009
Адрес: Moscow
Сообщений: 469
|
ух ты, работает! ![]() |
![]() |
![]() |
Часовой пояс GMT +4, время: 18:58. |
|
|
« Предыдущая тема | Следующая тема » |
|
|