Jumat, 21 Maret 2014

Handling Events to Cut Working-time

This is the class to handle events in K

/**
 *
 * @author mi_kuncoro@yahoo.co.id
 * @include k.js
*/
if (!K) alert("You must include k.js in HTMLElement");
/*
 * Mouse position
 * Only updated when eventManager mouse active
*/
K.mouseX = 0;
K.mouseY = 0;
/*
 * Enter Frame Event Handler
 * Set by your own function
*/
K.FrameManager = function(f_callback)
{
var _active = false;
var _id = null;
var _nFrame = 0;
this.active = false;
this.getFrameElapsed = function() {
return _nFrame;
};
this.callback = f_callback;
this.update = function() {
_nFrame++;
this.callback(_nFrame);
if (_active == true) {
_id = window.requestAnimationFrame(
function(e){
FM.update();
}
);
}
};
this.activate = function() {
if (_active == true) return;
_active = this.active = true;
window.FM = this;
this.update();
};
this.deactivate = function() {
if (_active == false) return;
_active = this.active = false;
if (_id) window.cancelAnimationFrame(_id);
window.FM = null;
};
};
/*
 * class
*/
K.EventListener = function(etype, fcall, odispatcher) {
this.name = "el_" + K.incrementCounter().toString();
this.dispatcher = odispatcher;
this.event = null;
this.eventType = etype;
this.eventCallback = fcall;
this.broadcastEvent = function(e) {
this.event = e;
this.eventCallback(e);
};
this.dispose = function() {
this.dispatcher = null;
};
};
/*
 * class
 * uses to manage events inside the platform
*/
K.EventManager = function()
{
var _active = false;
var _listeners = {
keydown : [],
keyup : [],
mousedown : [],
mousemove : [],
mouseup : [],
click : [],
accel : [],
enterFrame : []
};
var broadcastEvent = function(a, e) {
for (var i = 0; i < a.length; i++) {
a[i].broadcastEvent(e);
}
};
var _fm = new K.FrameManager(
function() {
broadcastEvent(_listeners.enterFrame, {eventType:"enterFrame"});
}
);
var inputDevices = {
keyboard: {active:false, lastInput:0 },
mouse: {active:false, lastInput:0 },
touch: { active:false, lastInput:0 },
accel: {active:false, lastInput:0 },
enterFrame:_fm
};
this.handleCustomEvent = function(e, t) {
broadcastEvent(_listeners[t], e);
};
this.handleKeyboard = function(e, t) {
inputDevices.keyboard.lastInput = e;
broadcastEvent(_listeners[t], e);
};
var _oUnderPoint = [];
var sortByOrder = function(a, b) {
if (a.dispatcher.order < b.dispatcher.order) return -1;
if (a.dispatcher.order > b.dispatcher.order) return 1;
return 0;
};
this.getObjectUnderPoint = function() {
return _oUnderPoint;
};
this.handleMouse = function(e, t) {
var xx = K.mouseX = e.offsetX;
var yy = K.mouseY = e.offsetY;
inputDevices.mouse.lastInput = e;
var a = _listeners[t];
_oUnderPoint.length = 0;
for (var i = 0; i < a.length; i++) {
if (a[i].dispatcher.hitTestPoint(xx, yy)) _oUnderPoint.push(a[i]);
}
if (_oUnderPoint.length > 0) {
_oUnderPoint.sort(sortByOrder);
_oUnderPoint.pop().broadcastEvent(e);
}
};
this.activate = function(inputType) {
if (inputDevices[inputType].active == true) return
inputDevices[inputType].active = true;
switch (inputType) {
case "enterFrame":
_fm.activate();
break;
case "keyboard":
document.addEventListener("keydown", function(e){ e.preventDefault(); K.eventManager.handleKeyboard(e, "keydown"); });
document.addEventListener("keyup", function(e){ e.preventDefault(); K.eventManager.handleKeyboard(e, "keyup"); });
break;
case "mouse":
var c = K.getCanvas();
c.addEventListener("click", function(e){ e.preventDefault(); K.eventManager.handleMouse(e, "click"); });
c.addEventListener("mousedown", function(e){ e.preventDefault(); K.eventManager.handleMouse(e, "mousedown");});
c.addEventListener("mousemove", function(e){ e.preventDefault(); K.eventManager.handleMouse(e, "mousemove");});
c.addEventListener("mouseup", function(e){ e.preventDefault(); K.eventManager.handleMouse(e, "mouseup");});
break;
case "touch":
// not supported without pluggin
break;
case "accel":
// not supported without pluggin
break;
}
};
this.deactivate = function(inputType) {
if (inputDevices[inputType].active == false) return;
inputDevices[inputType].active = false;
switch (inputType) {
case "enterFrame":
_fm.deactivate();
break;
case "keyboard":
document.removeEventListener("keydown", function(e){ e.preventDefault(); K.eventManager.handleKeyboard(e, "keydown"); });
document.removeEventListener("keyup", function(e){ e.preventDefault(); K.eventManager.handleKeyboard(e, "keyup"); });
break;
case "mouse":
var c = K.getCanvas();
c.removeEventListener("click", function(e){ e.preventDefault(); K.eventManager.handleMouse(e, "click"); });
c.removeEventListener("mousedown", function(e){ e.preventDefault(); K.eventManager.handleMouse(e, "mousedown"); });
c.removeEventListener("mousemove", function(e){ e.preventDefault(); K.eventManager.handleMouse(e, "mousemove"); });
c.removeEventListener("mouseup", function(e){ e.preventDefault(); K.eventManager.handleMouse(e, "mouseup"); });
break;
case "touch":
// not supported without pluggin
break;
case "accel":
// not supported without pluggin
break;
}
};
this.addEventListener = function(el) {
if (!_listeners[el.eventType]) _listeners[el.eventType] = [];
_listeners[el.eventType].push(el);
};
this.removeEventListener = function(el) {
var a = _listeners[el.eventType];
var idx = -1;
for (var i = 0; i < a.length; i++) {
if (a[i].name == el.name) {
idx = i;
break;
}
}
if (i < 0) return;
_listeners[el.eventType].splice(idx, 1);
el.dispose();
};
};
/*
 * EventManager instance of K
*/
K.eventManager = new K.EventManager();
/*
 * class
 * Every interactive Object must have it to enable EventManager manage rhe events
*/
K.EventDispatcher = function(o)
{
this.owner = o;
this.eventListeners = {
keydown:null,
keyup:null,
click:null,
mousedown:null,
mousemove:null,
mouseup:null,
accel:null,
enterFrame:null
};
};
K.EventDispatcher.prototype =
{
constructor:K.EventDispatcher,
dispatchEvent:function(e) {
if (!e.eventType) {
alert("an event must has eventType ");
return;
}
e.dispatcher = this.owner;
K.eventManager.handleCustomEvent(e, e.eventType);
},
eventListeners:null,
owner:null,
addEventListener:function(eventType, eventCallback) {
var o = new K.EventListener(eventType, eventCallback, this.owner);
K.eventManager.addEventListener(o);
this.eventListeners[eventType] = o;
},
removeEventListener:function(eventType) {
var o = this.eventListeners[eventType];
K.eventManager.removeEventListener(o);
this.eventListeners[eventType] = null;
}
};

Tidak ada komentar:

Posting Komentar