Mediamonkey
%Europe/Berlin %914 %2005, 22:56
Hey luitjes.
Ik had nog een beginnetje liggen van een class in ontwikkeling, die heb ik vanavond maar even in een uurtje afgemaakt. Voor wie ongeduldig op m'n tutorial over webservices zit te wachten: sorry.. prioriteiten he ;)
De KeySequence class is bedoeld om gemakkelijk een woord in te kunnen typen en daar een functie aan te koppelen die wordt getriggered zodra het woord af is. Ik gebruik 'm zelf om stiekeme eastereggs (verstopt grapje in een applicatie) in te bouwen. Wanneer je bijvoorbeeld "Mediamonkey" intypt komt er een animatie in beeld met mijn naam. Maar ik kan me ook wel wat nuttigers voorstellen. :D
import mx.events.EventDispatcher;
import mx.utils.Delegate;
class KeySequence {
private var keyListener:Object;
private var sequences:Array;
private var selectedSequence:Number;
private var pointer:Number;
public var addEventListener:Function;
public var removeEventListener:Function;
public var dispatchEvent:Function;
public var dispatchQueue:Function;
public function KeySequence() {
EventDispatcher.initialize(this);
sequences = new Array();
pointer = 0;
keyListener = new Object();
Key.addListener(keyListener);
keyListener.onKeyDown = Delegate.create(this, setSequenceKey);
}
public function addSequence(str:String, callback:Function):Void {
var seq:Array = new Array();
seq.callback = callback;
for (var i=0; i<str.length; i++) {
seq.push(str.charAt(i).toUpperCase());
}
sequences.push(seq);
}
private function setSequenceKey():Void {
var key:String = String.fromCharCode(Key.getCode());
if (!selectedSequence) selectedSequence = getCorrectSequence(key);
var seq = sequences[selectedSequence];
if (seq[pointer++] == key) {
if (seq.length == pointer) {
var returnObject:Object = {type:"complete", target:this , result:seq.join("").toLowerCase()};
dispatchEvent(returnObject);
seq.callback.apply(seq, returnObject);
resetSequence();
}
} else resetSequence();
}
private function getCorrectSequence(key:String):Number {
var i = sequences.length;
while (i--) if (sequences[i][pointer] == key) return i;
return null;
}
private function resetSequence():Void {
delete selectedSequence;
pointer = 0;
}
}
En nu een voorbeeld (plak dit op een frame in je fla-root) :
import mx.utils.Delegate;
import KeySequence;
var myKeySequencer:KeySequence;
init();
function init():Void {
myKeySequencer = new KeySequence();
myKeySequencer.addEventListener("complete", Delegate.create(this, onComplete));
myKeySequencer.addSequence("bart", Delegate.create(this, onBart));
myKeySequencer.addSequence("mediamonkey", Delegate.create(this, onMediamonkey));
}
function onComplete(evt:Object):Void {
trace("KeySequence complete: "+evt.result);
}
function onBart(evt:Object):Void {
trace("onBart method called");
}
function onMediamonkey(evt:Object):Void {
trace("onMediamonkey method called");
}
Als je het gebruik van de Delegate class niet snapt, bekijk dan ThaNarie's topic in dit subforum. Het is een handige manier om methodes door te geven/te koppelen terwijl je het bereik binnen een class behoudt. En als je niet vertrouwd bent met de EventDispatcher... GA HEM UITTESTEN! NU! Ik zweer erbij, hij is zo handig omdat je precies weet wanneer een functie klaar is met z'n proces, waarna je een andere functie kunt aanroepen met het verkregen resultaat. En de combinatie van een EventDispatcher met een Delegate.. OOOHHH *kwijl*! :p
- Mediamonkey -
Ik had nog een beginnetje liggen van een class in ontwikkeling, die heb ik vanavond maar even in een uurtje afgemaakt. Voor wie ongeduldig op m'n tutorial over webservices zit te wachten: sorry.. prioriteiten he ;)
De KeySequence class is bedoeld om gemakkelijk een woord in te kunnen typen en daar een functie aan te koppelen die wordt getriggered zodra het woord af is. Ik gebruik 'm zelf om stiekeme eastereggs (verstopt grapje in een applicatie) in te bouwen. Wanneer je bijvoorbeeld "Mediamonkey" intypt komt er een animatie in beeld met mijn naam. Maar ik kan me ook wel wat nuttigers voorstellen. :D
import mx.events.EventDispatcher;
import mx.utils.Delegate;
class KeySequence {
private var keyListener:Object;
private var sequences:Array;
private var selectedSequence:Number;
private var pointer:Number;
public var addEventListener:Function;
public var removeEventListener:Function;
public var dispatchEvent:Function;
public var dispatchQueue:Function;
public function KeySequence() {
EventDispatcher.initialize(this);
sequences = new Array();
pointer = 0;
keyListener = new Object();
Key.addListener(keyListener);
keyListener.onKeyDown = Delegate.create(this, setSequenceKey);
}
public function addSequence(str:String, callback:Function):Void {
var seq:Array = new Array();
seq.callback = callback;
for (var i=0; i<str.length; i++) {
seq.push(str.charAt(i).toUpperCase());
}
sequences.push(seq);
}
private function setSequenceKey():Void {
var key:String = String.fromCharCode(Key.getCode());
if (!selectedSequence) selectedSequence = getCorrectSequence(key);
var seq = sequences[selectedSequence];
if (seq[pointer++] == key) {
if (seq.length == pointer) {
var returnObject:Object = {type:"complete", target:this , result:seq.join("").toLowerCase()};
dispatchEvent(returnObject);
seq.callback.apply(seq, returnObject);
resetSequence();
}
} else resetSequence();
}
private function getCorrectSequence(key:String):Number {
var i = sequences.length;
while (i--) if (sequences[i][pointer] == key) return i;
return null;
}
private function resetSequence():Void {
delete selectedSequence;
pointer = 0;
}
}
En nu een voorbeeld (plak dit op een frame in je fla-root) :
import mx.utils.Delegate;
import KeySequence;
var myKeySequencer:KeySequence;
init();
function init():Void {
myKeySequencer = new KeySequence();
myKeySequencer.addEventListener("complete", Delegate.create(this, onComplete));
myKeySequencer.addSequence("bart", Delegate.create(this, onBart));
myKeySequencer.addSequence("mediamonkey", Delegate.create(this, onMediamonkey));
}
function onComplete(evt:Object):Void {
trace("KeySequence complete: "+evt.result);
}
function onBart(evt:Object):Void {
trace("onBart method called");
}
function onMediamonkey(evt:Object):Void {
trace("onMediamonkey method called");
}
Als je het gebruik van de Delegate class niet snapt, bekijk dan ThaNarie's topic in dit subforum. Het is een handige manier om methodes door te geven/te koppelen terwijl je het bereik binnen een class behoudt. En als je niet vertrouwd bent met de EventDispatcher... GA HEM UITTESTEN! NU! Ik zweer erbij, hij is zo handig omdat je precies weet wanneer een functie klaar is met z'n proces, waarna je een andere functie kunt aanroepen met het verkregen resultaat. En de combinatie van een EventDispatcher met een Delegate.. OOOHHH *kwijl*! :p
- Mediamonkey -