Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   MouseEvent ссылка на объект (http://www.flasher.ru/forum/showthread.php?t=214698)

razerw 08.11.2017 09:28

MouseEvent ссылка на объект
 
Добрый день друзья, столкнулся с такой проблемой. требуется ваша помощь.
установил слушатель MouseEvent.CLICK в функции mouseClickHandler отлавливаю событие.
на сцене у меня находится танк я по нему счелкую и трейсю trace(event.target);
получаю сообщение о том что я кликаю по объекту [object Tank_mc]. и вот вопрос как мне обратиться к функциям и методам данного объекта? Tank_mc это мувик из библиотека, инициализировал его класс EnemyTank.

undefined 08.11.2017 10:56

Код AS3:

var tank:EnemyTank=e.target as EnemyTank;
if(tank)
    tank.tankMethod();


ZackMercury 08.11.2017 11:19

Если подписан на клик EnemyTank, то
Код AS3:

var tank:EnemyTank = e.currentTarget as EnemyTank;
if(tank)
    tank.tankMethod();


razerw 08.11.2017 11:43

Цитата:

Сообщение от undefined (Сообщение 1202794)
Код AS3:

var tank:EnemyTank=e.target as EnemyTank;
if(tank)
    tank.tankMethod();


trace(tank) выдает null

ZackMercury 08.11.2017 11:58

лол, а на что у вас слушатель CLICK повешен?

razerw 08.11.2017 12:18

Цитата:

Сообщение от ZackMercury (Сообщение 1202797)
лол, а на что у вас слушатель CLICK повешен?

ну вообще есть класс Game данный класс создает объект EnemyTank
как раз в классе Game и инициализаруется слушатель CLICK

Добавлено через 1 минуту
я знаю что можно понапихать MouseEvent.CLICK в сами объекты EnemyTank и они будут выдавать то что мне нужно, но если у меня будет 20 танков, это будет расточительство, поэтому я и инициализирую 1 слушатель в главном классе

ZergMaster 08.11.2017 12:38

если EnemyTank ребенок Game, то главное - не забыть EnemyTank поставить mouseChildren = false;
попробуйте все потрейсить да посмотреть, что там как

Код AS3:

trace(event.target)
var tank:EnemyTank = event.target as EnemyTank;
trace(tank)
if(tank)
    tank.tankMethod();


undefined 08.11.2017 12:40

А у Tank_mc в linkage id стоит EnemyTank или EnemyTank создает new Tank_mc(); и добавляет в себя?

ZergMaster 08.11.2017 12:43

или может быть Tank_mc это linkage и EnemyTank extends Tank_mc.. ?

razerw 08.11.2017 12:45

Цитата:

Сообщение от undefined (Сообщение 1202802)
А у Tank_mc в linkage id стоит EnemyTank или EnemyTank создает new Tank_mc(); и добавляет в себя?

совершенно верно

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

Сообщение от ZergMaster (Сообщение 1202804)
или может быть Tank_mc это linkage и EnemyTank extends Tank_mc.. ?

Tank_mc это мувик находится в библиотеке. EnemyTank делает вот так _sprite = new Tank_mc(); а потом add

undefined 08.11.2017 12:50

и потом этот EnemyTank подписывается на CLICK?

razerw 08.11.2017 12:55

Цитата:

Сообщение от undefined (Сообщение 1202808)
и потом этот EnemyTank подписывается на CLICK?

что значит подписывается, я вижу танк на сцене и щелкую по нему мышкой

undefined 08.11.2017 12:58

приведи строку,где вешается слушатель CLICK

razerw 08.11.2017 13:03

addEventListener(MouseEvent.CLICK, mouseClickHandler); данная старка выполняется в классе Games

Добавлено через 59 секунд
а кликаю я по танку Tank_mc это мувик созданный классом EnemyBase

undefined 08.11.2017 13:06

бр, ты же сказал что EnemyTank создает Tank_mc и кладет в себя

razerw 08.11.2017 13:07

по нажатию на Tank_mc я хочу вызывать методы класса EnemyBase

Добавлено через 36 секунд
ой блин да да EnemyTank загнался извините

ZackMercury 08.11.2017 13:10

Просто забудьте про event.target и используйте event.currentTarget.
Это в случае, если на клик подписан экземпляр класса EnemyTank.
Иначе тащите parent. (Чего лучше не делать)

razerw 08.11.2017 13:11

тоже null

ZackMercury 08.11.2017 13:14

Вам нужно не
Код AS3:

addEventListener(MouseEvent.CLICK, mouseClickHandler);

а
Код AS3:

for each(var tank:EnemyTank in enemyTanks) tank.addEventListener(MouseEvent.CLICK, mouseClickHandler);

где enemyTanks это ваш массив с танками.

undefined 08.11.2017 13:19

добавь в EnemyTank
Код AS3:

mouseChildren=false;

и затрейси
Код AS3:

trace(e.target,e.currentTarget);


ZackMercury 08.11.2017 13:22

Не понимаю, зачем так делать, не нужно же никаких mouseChildren, когда у тебя currentTarget тот, что ты сам подписал руками.

undefined 08.11.2017 13:24

так он не танчики подписывает, а парента.

ZackMercury 08.11.2017 13:28

У этого подхода есть какие-то плюсы, кроме постоянной конфузии с event.target?

ZergMaster 08.11.2017 13:30

плюс в том, что одно событие на множество объектов. Никаких конфузий

ZackMercury 08.11.2017 13:34

Так а где плюс? Ну да, никаких, учитывая, сколько подобных тем уже.

ZergMaster 08.11.2017 13:38

Мы в итоге так и не поняли, как у тебя создается твой многострадальный танк.
Если у тебя сделано так, что есть класс Game, который Sprite (ну или MovieClip), который создает экземпляр и добавляет в себя EnemyTank

Код AS3:

var enemyTank:EnemyTank = new EnemyTank();
addChild(enemyTank);

EnemyTank же создает в себе всякое, в том числе и добавляет в себя графику, в том числе мувик
Код AS3:

var tank:MovieCLip = new Tank_mc();
addChild(tank);

то для того, чтобы все работало, нужно в EnemyTank прописать
Код AS3:

mouseChildren = false;

в Game добавить слушатель
Код AS3:

addEventListener(MouseEvent.CLICK, clickHandler)

и потом в слушателе
Код AS3:

private function clickHandler(event:MouseEvent):void
 {
  trace(event.target);
 }


razerw 08.11.2017 13:48

Цитата:

Сообщение от undefined (Сообщение 1202821)
добавь в EnemyTank
Код AS3:

mouseChildren=false;

и затрейси
Код AS3:

trace(e.target,e.currentTarget);


trace(event.currentTarget, event.target);

[object Game] [object Tank_mc]

undefined 08.11.2017 13:49

Цитата:

У этого подхода есть какие-то плюсы, кроме постоянной конфузии с event.target?
А я и не говорил, что у этого есть плюсы.Возможно у товарища вообще нет массива всех танчиков.
Цитата:

плюс в том, что одно событие на множество объектов. Никаких конфузий
Число событий никак не зависит от числа слушателей

ZackMercury 08.11.2017 13:53

Цитата:

trace(event.currentTarget, event.target);

[object Game] [object Tank_mc]
Нужно больше кода :)

Если вы добавили в EnemyTank mouseChildren = false, то это говорит о том, что вы Tank_mc добавляете не внутрь него, а куда-то в другое место х)

razerw 08.11.2017 13:57

Цитата:

Сообщение от razerw (Сообщение 1202828)
trace(event.currentTarget, event.target);

[object Game] [object Tank_mc]

возможно я не правильно изъяснился, попробую еще раз.

класс Games создает EnemyTank класс унаследован EnemyTank extends EnemyBase
в конструкторе EnemyTank происходит следующее
_sprite = new Tank_mc(); // Tank_mc мувик из библиотеки
_sprite.mouseChildren = false;
в конструкторе EnemyBase
addChild(_sprite);

сам слушатель кликанья инициализарован в классе games

ZackMercury 08.11.2017 14:02

В конструкторе EnemyTank добавьте this.mouseChildren = false
Не _sprite.mouseChildren = false.

razerw 08.11.2017 14:03

теперь я понял в чем моя ошибка , друзья. всем большое спасибо!!!


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

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