PDA

Просмотр полной версии : Не отрабатывает листенер мыши


BuKT
27.06.2011, 12:01
package {
import flash.display.MovieClip;
import flash.events.MouseEvent;
/**
* ...
* @author Me
*/
public class Main extends MovieClip {

public function Main() {
addEventListener(Event.ADDED_TO_STAGE, addedToStageListener);
}

private function addedToStageListener(e:Event):void {
removeEventListener(Event.ADDED_TO_STAGE, addedToStageListener);
graphics.beginFill(0x000000);
graphics.drawCircle(300, 300, 20);
graphics.endFill();
addEventListener(MouseEvent.CLICK, mouseClickListener)
trace (hasEventListener(MouseEvent.CLICK)); //True
}

private function mouseClickListener(e:MouseEvent):void {
trace ('olololololol'); //Никогда не вызывается
}
}
}

Аналогично для маусап, маусмув и прочих. Что я делаю не так?

t4arty
27.06.2011, 13:04
что бы сработало Вам надо найти область которую занимает Ваш Main и нажать на нее = ), тогда заработает

Sintesis
27.06.2011, 15:36
вот так можно:


package {
import flash.display.MovieClip;
import flash.display.Sprite;
import flash.events.MouseEvent;
import flash.events.Event;
/**
* ...
* @author Me
*/
public class Main extends Sprite {

public function Main() {


addEventListener(Event.ADDED_TO_STAGE, addedToStageListener);
}

private function addedToStageListener(e:Event):void {
removeEventListener(Event.ADDED_TO_STAGE, addedToStageListener);

var circle:MovieClip = new MovieClip();
circle.graphics.beginFill(0x000000);
circle.graphics.drawCircle(300, 300, 20);
circle.graphics.endFill();
circle.addEventListener(MouseEvent.CLICK, mouseClickListener);

stage.addChild(circle);
}

private function mouseClickListener(e:MouseEvent):void {
trace ('olololololol'); //Никогда не вызывается
}
}
}

spooner
27.06.2011, 15:36
Не рисуйте в graphics Main'а, создайте Sprite, добавте его addChild'ом в Main и рисуйте в нем.

bav
27.06.2011, 16:09
Sintesis, spooner, да, со спрайтом клики обрабатываются. Но вот вопрос, отчего же не работает первый вариант с рисованием прямо в Main? Меня это, признаться удивило.

serogah
27.06.2011, 17:57
Привет!
Sintesis, spooner, да, со спрайтом клики обрабатываются. Но вот вопрос, отчего же не работает первый вариант с рисованием прямо в Main? Меня это, признаться удивило.

Потому что класс Graphics наследуется только от Object - следственно он не реагирует на события "мыши".

КорДум
27.06.2011, 18:12
Потому что класс Graphics наследуется только от Object - следственно он не реагирует на события "мыши".
Не в ту сторону мыслите. Main расширяется от наследника InteractiveObject, а значит клики должны срабатывать.

dimarik
27.06.2011, 18:19
DocumentClass (http://books.google.ru/books?id=gUHX2fcLKxYC&lpg=PA533&ots=cvPZ0qbQv8&dq=Vector%20graphics%20ignored%20in%20main-class%20instance&pg=PA533#v=onepage&q=Vector%20graphics%20ignored%20in%20main-class%20instance&f=false) не слушает события мыши.

bav
28.06.2011, 02:15
Благодарствую.

КорДум
28.06.2011, 03:02
Развеяли непонятку, Дмитрий.

BuKT
28.06.2011, 07:11
Тогда другой вопрос. Код приведённый выше - максимальное упрощение от бессилия. Изначально там создавался инстанс заембеженной SWF и на неё вешался листенер. Что-то вроде этого:
[Embed source='../lib/some.swf'] private var SWFObject:Class;
var swf:MovieClip = new SWFObject() as MovieClip;
addChild(swf);
swf.addEventListener(MouseEvent.CLICK,clickListener);
И всё равно клик не срабатывал. Этот инстанс разве попадает под определение векторной графики? Или проблема в том, что где-то в той swf может отдельно слушаться on(press) и событие просто не поднимается до контейнера? Если да - то можно ли как-то прослушивать такие непонятные флешки (с заранее неизвестным содержимым)? Что-нибудь вроде жкверного preventDefault()?