Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Получить id объекта при hitTest. (http://www.flasher.ru/forum/showthread.php?t=167026)

Astraport 07.09.2011 16:20

Получить id объекта при hitTest.
 
Программно создаются объекты:

Код AS3:

for (var i:uint = 0; i <maxImages; i++){
                                        var newimg:Image = new Image();
                                        newimg.height = 100;
                                        newimg.width = 100;
                                        newimg.x = 100+ i*100;
                                        newimg.y = 200;
                                        newimg.source = 'images/' + i + 'img.png';
                                        newimg.id = i + 'img';
                                        this.addElement(newimg);
                                }

При инициализации создаю слушатель и двигаю героя. При взаимодействии героя с созданными графическими объектами требуется получить их id:
Код AS3:

addEventListener(Event.ENTER_FRAME, startDragging);
 
protected function startDragging(event:Event):void
                        {
                                if (newimg.hitTestPoint(hero.x, hero.y, true)){
                                        trace ('Hero hitTest ' + event.currentTarget.id); //Это понятное дело не работает
                                }
 
                        }

Как лучше это сделать?
Спасибо.

bav 07.09.2011 16:42

Код AS3:

if (newimg.hitTestPoint(hero.x, hero.y, true)) {
    newimg.dispatchEvent( /* тут можно какое-нибудь свое событие определить */ );
}

Далее, где вам нужно, ловите это событие и обращаетесь к event.target.

-De- 07.09.2011 16:43

Код AS3:

trace ('Hero hitTest ' + newimg.id);

Как обьекты перебираются-то?

Astraport 07.09.2011 17:16

Цитата:

Как обьекты перебираются-то?
Не понял. newimg.id - выводит только id последнего объекта.

Цитата:

Далее, где вам нужно, ловите это событие и обращаетесь к event.target.
Я сделал так:
1. Создал новый ивент класс:
Код AS3:

package
{
        import flash.events.Event;
 
        public class HitTestEvent extends flash.events.Event
        {
                public static const CONTROL_TYPE:String = "hit";
                public var command:String;
                public function HitTestEvent(command:String)
                {
                        super(CONTROL_TYPE);
                        this.command = command;
                }
        }
}

2. Диспатчу так:
Код AS3:

if (newimg.hitTestPoint(hero.x, hero.y, true)) {
    newimg.dispatchEvent(new HitTestEvent('hit')); );
}

или так:
Код AS3:

if (newimg.hitTestPoint(hero.x, hero.y, true)) {
    dispatchEvent(new HitTestEvent(newimg.id));
}

3. При инициализации приложения вешаю слушатель:
Код AS3:

addEventListener(HitTestEvent.CONTROL_TYPE, eventHandler);
                        }
 
                        protected function eventHandler(event:HitTestEvent):void
                        {
                                trace(event.command);
                                trace(event.target.id);
                                trace(event.currentTarget.id);
                        }

В любом случае трейсится все что угодно, но не id объектов.

bav 07.09.2011 17:33

Код AS3:

if (newimg.hitTestPoint(hero.x, hero.y, true)) {
    newimg.dispatchEvent(new HitTestEvent('hit') );
}
// Здесь неясно куда вы вешаете слушатель. Попробуйте перехват событий:
addEventListener(HitTestEvent.CONTROL_TYPE, eventHandler, true);
 
// А в трейсе выведите event.target
protected function eventHandler(event:HitTestEvent):void
{
        trace(event.target); // [object Image] ?
        trace((event.target as Image).id);
}


Astraport 07.09.2011 17:48

bav, спасибо, но проблема не в этом. Только сейчас заметил, что hitTestPoint трейсится только для последнего объекта.
-De- видимо правильно заметил, что нужен перебор объектов. Но как? Все объекты выводятся, но hitTestPoint получается только для последнего из них.

-De- 07.09.2011 17:50

Ну с кем хиттестится, того айди и выводит. В чем проблема-то?
Код AS3:

if (newimg.hitTestPoint(hero.x, hero.y, true)) {
    eventHandler(newimg.id);
}
...
protected function eventHandler(id:int):void
{
        trace(id); // id
}

Вы это пытаетесь сделать?

Astraport 07.09.2011 18:14

-De-, я ж говорю - хиттест срабатывает только для последнего созданного объекта. В моем примере, если maxImages = 5, с id = '4img'. Остальные никак не реагируют, хотя если повесить на каждый создаваемый объект слушатель на мышиные события - то они срабатывают (мышиные события).

-De- 07.09.2011 18:17

Ээ а вы не догадывались, что хиттест будет срабатывать только для тех обьектов, для которых он будет вызываться?

Astraport 07.09.2011 18:30

Догадывался:) Сбило с толку то, что трейсились события. Оказывается, это от одного объекта исходило, близко расположены.
Хорошо. Я знаю id этих всех объектов. Как мне обратится к объекту зная Id?
getChildByName выдает ошибку Не удается вызвать свойство или метод со ссылкой на объект "null".


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

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