Ich habe schon lange nach benutzerdefinierten Ereignissen (Listenern) gesucht, aber nie eine erfolgreich erstellt. Es gibt so viele verschiedene Methoden, die die Event-Klasse erweitern, aber auch die EventDispatcher-Klasse erweitern, sehr verwirrend! Ich möchte mich damit ein für alle Mal abfinden und die entsprechende Technik erlernen.Benutzerdefinierter Ereignisspeicherort
package{
import flash.events.Event;
public class CustomEvent extends Event{
public static const TEST:String = 'test'; //what exac is the purpose of the value in the string?
public var data:Object;
public function CustomEvent(type:String, bubbles:Boolean = false, cancelable:Boolean = false, data:Object = null):void
{
this.data = data;
super();
}
}
}
Soweit ich eine benutzerdefinierte Klasse wissen, wo Sie die Anforderungen für den Fall festgelegt versandt werden muss gemacht werden:
package
{
import flash.display.MovieClip;
public class TestClass extends MovieClip
{
public function TestClass():void {
if (ConditionForHoldToComplete == true) {
dispatchEvent(new Event(CustomEvent.TEST));
}
}
}
}
Ich bin nicht sicher, ob dies richtig ist, aber es sollte etwas in dieser Richtung sein.
Jetzt was ich will, ist so etwas wie ein mousevent, das auf ein Ziel angewendet werden kann und keine bestimmte Klasse erfordert.
Es wäre so etwas wie dies funktioniert:
package com.op_pad._events{
import flash.events.MouseEvent;
import flash.utils.Timer;
import flash.events.TimerEvent;
import flash.events.EventDispatcher;
import flash.events.Event;
public class HoldEvent extends Event
{
public static const HOLD_COMPLETE:String = "hold completed";
var timer:Timer;
public function SpriteEvent(type:String, bubbles:Boolean=true, cancelable:Boolean=false)
{
super(type, bubbles, cancelable);
timer = new Timer(1000, 1);
//somehow find the target where is event is placed upon -> target.addEventlistener
target.addEventListener(MouseEvent.MOUSE_DOWN, startTimer);
target.addEventListener(MouseEvent.MOUSE_UP, stopTimer);
}
public override function clone():Event
{
return new SpriteEvent(type, bubbles, cancelable);
}
public override function toString():String
{
return formatToString("MovieEvent", "type", "bubbles", "cancelable", "eventPhase");
}
//////////////////////////////////
///// c o n d i t i o n s /////
//////////////////////////////////
private function startTimer(e:MouseEvent):void
{
timer.start();
timer.addEventListener(TimerEvent.TIMER_COMPLETE, complete);
}
private function stopTimer(e:MouseEvent):void
{
timer.stop()
}
public function complete(e:TimerEvent):void {
dispatchEvent(new HoldEvent(HoldEvent.HOLD_COMPLETE));
}
}
}
offensichtlich Das wird nicht funktionieren, aber sollten Sie eine Vorstellung davon, was ich erreichen will. Dies sollte möglich sein, da mouseevent auf alles angewendet werden kann. Das Hauptproblem ist, dass ich nicht weiß, wo ich die Anforderungen für das auszuführende Ereignis einstellen soll, um es auf Movieclips und Sprites anwenden zu können.
Ihr Beispiel ist eine Art verwirrend, weil Sie im Grunde nur ein benutzerdefiniertes Ereignis zu versuchen, zwei bestehende Einbau-Ereignisse zu enthalten. Versuchen Sie Ihre Frage zu bearbeiten und erklären Sie, was Sie wirklich erreichen möchten und ich werde Ihnen gerne helfen. Im Allgemeinen sollte die Ereignisklasse selbst keine zusätzlichen Ereignisse hinzufügen, Timer verwenden usw. Diese Art von Logik sollte in Ereignis-Listenern verwendet werden. – sberry