Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   e.target is interface не работает! (http://www.flasher.ru/forum/showthread.php?t=155927)

alatar 12.05.2011 20:16

Ну вы и проверили. Проверяемый объект не реализовывает InEDMenu. Все работает.

Добавлено через 1 минуту
target всегда указывает на объект в котором возникло событие. В вашем случае это были внутренности объекта, который вы хотели проверить.

Wolsh 12.05.2011 21:01

Вы поместили слушатель в stage, поэтому MouseEvent#currentTarget будет ссылаться на объект Stage.
Источником События был спрайт, поэтому MouseEvent#target будет ссылаться на объект Sprite.
Объект класса EDMenu находится в stage и содержит в себе спрайт. Если этому объекту запретить mouseChildren, источником События станет он сам, и Вы сможете получить на него ссылку из MouseEvent#target. Иначе, и правильно, Вы должны были добавить слушателя объекту EDMenu, а не стейджу, и получать на него ссылку как MouseEvent#currentTarget. Впрочем, запрещать mouseChildren для подобных объектов - тоже правильная практика.

cleptoman 13.05.2011 14:03

либо перебирать массив объектов под точкой курсора, пока не наткнетесь на свой интерфейсный объект)

stweet 13.05.2011 14:10

Цитата:

Сообщение от cleptoman (Сообщение 995933)
либо перебирать массив объектов под точкой курсора, пока не наткнетесь на свой интерфейсный объект)

Накладно выходит.

Добавлено через 42 секунды
Ну собствеено, просто не могу всё же привести к типу данных. Создаю класс(Буттонс) имплементирую его как (к примеру) ИмБуттон, в нём создаю объкт спрайт(он же и есть кнопка). как теперь указать что этот спрайт пренадлежит классу Буттонс? Т.е. как бы я не обращался к этому спрайту он мне всегда отвечал что он кнопка.

Добавлено через 17 минут
Код AS3:

// ****************************************
public class Horizontal extends Rect implements InScroll
{
        // ..............
 
        scroll = new RoundRect();
        addChild(scroll);
        // ..............
{
 
// ****************************************
public class Main extends Sprite
{
 
        public function Main():void
        {
                // ..............
                var scroll:Horizontal = new Horizontal(200, 6, 0x000099);
                addChild(scroll);
                // ..............
                stage.addEventListener(MouseEvent.MOUSE_OVER, onMouse);
                // ..............
        }
 
        private function onMouse(e:MouseEvent):void
        {
                trace(e.target);// [object RoundRect]
                trace(e.target is InScroll && e.target is Horizontal); // false
                trace(e.currentTarget is InScroll); // false
        }
 
}
// ****************************************
 
// Вот пример.

Добавлено через 25 минут
Цитата:

Сообщение от Wolsh (Сообщение 995789)
Вы поместили слушатель в stage, поэтому MouseEvent#currentTarget будет ссылаться на объект Stage.
Источником События был спрайт, поэтому MouseEvent#target будет ссылаться на объект Sprite.
Объект класса EDMenu находится в stage и содержит в себе спрайт. Если этому объекту запретить mouseChildren, источником События станет он сам, и Вы сможете получить на него ссылку из MouseEvent#target. Иначе, и правильно, Вы должны были добавить слушателя объекту EDMenu, а не стейджу, и получать на него ссылку как MouseEvent#currentTarget. Впрочем, запрещать mouseChildren для подобных объектов - тоже правильная практика.

Вроде бы дошло. Получаеться, мне надо блокировать все объекты до нужного мне класса, тогда под точкой курсора все объекты будут ссылаться на этот класс, я правильно понял?

Добавлено через 58 минут
Код AS3:

// Собственно к чему я пришёл.
public class Main extends Sprite
{
        private var scroll:Horizontal = new Horizontal(200, 6, 0x000099);
 
        public function Main():void
        {
                if (stage) init();
                else addEventListener(Event.ADDED_TO_STAGE, init);
        }
 
        private function init(e:Event = null):void
        {
                removeEventListener(Event.ADDED_TO_STAGE, init);
                // entry point
 
                scroll.x = 20;
                scroll.y = 20;
 
                addChild(scroll);
 
                stage.addEventListener(MouseEvent.MOUSE_DOWN,        onMouse);
                stage.addEventListener(MouseEvent.MOUSE_UP,        offMouse);
        }
 
        private function offMouse(e:MouseEvent):void
        {
                for (var i:int = 0; i < numChildren; i++)
                {
                        if (scroll.act) { scroll.scrollStop(); }
                }
        }
 
        private function onMouse(e:MouseEvent):void
        {
                if (e.target == scroll) { scroll.scrollMove(); }
        }
 
}
// а хотелось задействовать интерфейс.

Добавлено через 1 час 1 минуту
Но это ппц как не правильно =(

GBee 13.05.2011 15:47

Да зачем вы на стейдж вешаете слушателей? Вам уже разжевали и намекнули.

Jewelz 13.05.2011 16:11

Цитата:

Сообщение от alatar (Сообщение 995776)
target всегда указывает на объект в котором возникло событие. В вашем случае это были внутренности объекта, который вы хотели проверить.

тут не только намекнули, но и прямым текстом сказали

stweet 13.05.2011 18:08

Цитата:

Сообщение от GBee (Сообщение 995961)
Да зачем вы на стейдж вешаете слушателей?

Да согласен, но раз продолжаю вести тему значит пока не нашёл нужного решения.
По вашему выходит, на каждый объект вешать слушателей?

Цитата:

тут не только намекнули, но и прямым текстом сказали
Сказали ошибку а не её решение.

etc 14.05.2011 17:35

stweet, отключайте mouseChildren.


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

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