Some refactoring
This commit is contained in:
53
lime/app/EventManager.hx
Normal file
53
lime/app/EventManager.hx
Normal file
@@ -0,0 +1,53 @@
|
||||
package lime.app;
|
||||
|
||||
|
||||
/*@:generic*/ class EventManager<T> {
|
||||
|
||||
|
||||
private var listeners:Array<T>;
|
||||
private var priorities:Array<Int>;
|
||||
|
||||
|
||||
public function new () {
|
||||
|
||||
listeners = new Array ();
|
||||
priorities = new Array ();
|
||||
|
||||
}
|
||||
|
||||
|
||||
private function _addEventListener (listener:T, priority:Int):Void {
|
||||
|
||||
for (i in 0...priorities.length) {
|
||||
|
||||
if (priority > priorities[i]) {
|
||||
|
||||
listeners.insert (i, listener);
|
||||
priorities.insert (i, priority);
|
||||
return;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
listeners.push (listener);
|
||||
priorities.push (priority);
|
||||
|
||||
}
|
||||
|
||||
|
||||
private function _removeEventListener (listener:T):Void {
|
||||
|
||||
var index = listeners.indexOf (listener);
|
||||
|
||||
if (index > -1) {
|
||||
|
||||
listeners.splice (index, 1);
|
||||
priorities.splice (index, 1);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -4,17 +4,16 @@ package lime.app;
|
||||
import lime.system.System;
|
||||
|
||||
|
||||
class UpdateEventManager {
|
||||
class UpdateEventManager extends EventManager<IUpdateEventListener> {
|
||||
|
||||
|
||||
private static var instance:UpdateEventManager;
|
||||
|
||||
private var listeners:Array<IUpdateEventListener>;
|
||||
|
||||
|
||||
public function new () {
|
||||
|
||||
listeners = new Array ();
|
||||
super ();
|
||||
|
||||
instance = this;
|
||||
|
||||
#if (cpp || neko)
|
||||
@@ -24,11 +23,11 @@ class UpdateEventManager {
|
||||
}
|
||||
|
||||
|
||||
public static function addEventListener (listener:IUpdateEventListener):Void {
|
||||
public static function addEventListener (listener:IUpdateEventListener, priority:Int = 0):Void {
|
||||
|
||||
if (instance != null) {
|
||||
|
||||
instance.listeners.push (listener);
|
||||
instance._addEventListener (listener, priority);
|
||||
|
||||
}
|
||||
|
||||
@@ -48,6 +47,17 @@ class UpdateEventManager {
|
||||
}
|
||||
|
||||
|
||||
public static function removeEventListener (listener:IUpdateEventListener):Void {
|
||||
|
||||
if (instance != null) {
|
||||
|
||||
instance._removeEventListener (listener);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
#if (cpp || neko)
|
||||
private static var lime_update_event_manager_register = System.load ("lime", "lime_update_event_manager_register", 2);
|
||||
#end
|
||||
|
||||
@@ -1,34 +1,74 @@
|
||||
package lime.graphics;
|
||||
|
||||
|
||||
import lime.app.EventManager;
|
||||
import lime.system.System;
|
||||
#if js
|
||||
import js.Browser;
|
||||
#end
|
||||
|
||||
|
||||
class RenderEventManager {
|
||||
@:access(lime.ui.Window)
|
||||
class RenderEventManager extends EventManager<IRenderEventListener> {
|
||||
|
||||
|
||||
private static var instance:RenderEventManager;
|
||||
|
||||
private var listeners:Array<IRenderEventListener>;
|
||||
private var event:RenderEvent;
|
||||
|
||||
|
||||
public function new () {
|
||||
|
||||
listeners = new Array ();
|
||||
instance = this;
|
||||
super ();
|
||||
|
||||
instance = this;
|
||||
event = new RenderEvent ();
|
||||
|
||||
#if js
|
||||
|
||||
untyped __js__ ("
|
||||
var lastTime = 0;
|
||||
var vendors = ['ms', 'moz', 'webkit', 'o'];
|
||||
for(var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {
|
||||
window.requestAnimationFrame = window[vendors[x]+'RequestAnimationFrame'];
|
||||
window.cancelAnimationFrame = window[vendors[x]+'CancelAnimationFrame']
|
||||
|| window[vendors[x]+'CancelRequestAnimationFrame'];
|
||||
}
|
||||
|
||||
if (!window.requestAnimationFrame)
|
||||
window.requestAnimationFrame = function(callback, element) {
|
||||
var currTime = new Date().getTime();
|
||||
var timeToCall = Math.max(0, 16 - (currTime - lastTime));
|
||||
var id = window.setTimeout(function() { callback(currTime + timeToCall); },
|
||||
timeToCall);
|
||||
lastTime = currTime + timeToCall;
|
||||
return id;
|
||||
};
|
||||
|
||||
if (!window.cancelAnimationFrame)
|
||||
window.cancelAnimationFrame = function(id) {
|
||||
clearTimeout(id);
|
||||
};
|
||||
|
||||
window.requestAnimFrame = window.requestAnimationFrame;
|
||||
");
|
||||
|
||||
handleFrame ();
|
||||
|
||||
#elseif (cpp || neko)
|
||||
|
||||
lime_render_event_manager_register (handleEvent, event);
|
||||
|
||||
#if (cpp || neko)
|
||||
lime_render_event_manager_register (handleEvent, new RenderEvent ());
|
||||
#end
|
||||
|
||||
}
|
||||
|
||||
|
||||
public static function addEventListener (listener:IRenderEventListener):Void {
|
||||
public static function addEventListener (listener:IRenderEventListener, priority:Int = 0):Void {
|
||||
|
||||
if (instance != null) {
|
||||
|
||||
instance.listeners.push (listener);
|
||||
instance._addEventListener (listener, priority);
|
||||
|
||||
}
|
||||
|
||||
@@ -45,7 +85,27 @@ class RenderEventManager {
|
||||
|
||||
}
|
||||
|
||||
Renderer.flip ();
|
||||
}
|
||||
|
||||
|
||||
private function handleFrame ():Void {
|
||||
|
||||
handleEvent (event);
|
||||
|
||||
#if js
|
||||
Browser.window.requestAnimationFrame (cast handleFrame);
|
||||
#end
|
||||
|
||||
}
|
||||
|
||||
|
||||
public static function removeEventListener (listener:IRenderEventListener) {
|
||||
|
||||
if (instance != null) {
|
||||
|
||||
instance._removeEventListener (listener);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -5,29 +5,26 @@ import lime.system.System;
|
||||
import lime.ui.Window;
|
||||
|
||||
|
||||
class Renderer {
|
||||
class Renderer implements IRenderEventListener {
|
||||
|
||||
|
||||
public var handle:Dynamic;
|
||||
|
||||
private static var instance:Renderer;
|
||||
|
||||
|
||||
public function new (window:Window) {
|
||||
|
||||
#if (cpp || neko)
|
||||
handle = lime_renderer_create (window.handle);
|
||||
RenderEventManager.addEventListener (this, -99999999);
|
||||
#end
|
||||
|
||||
instance = this;
|
||||
|
||||
}
|
||||
|
||||
|
||||
public static function flip ():Void {
|
||||
public function onRender (event:RenderEvent):Void {
|
||||
|
||||
#if (cpp || neko)
|
||||
lime_renderer_flip (instance.handle);
|
||||
lime_renderer_flip (handle);
|
||||
#end
|
||||
|
||||
}
|
||||
@@ -39,4 +36,4 @@ class Renderer {
|
||||
#end
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
@@ -1,20 +1,20 @@
|
||||
package lime.ui;
|
||||
|
||||
|
||||
import lime.app.EventManager;
|
||||
import lime.system.System;
|
||||
|
||||
|
||||
class KeyEventManager {
|
||||
class KeyEventManager extends EventManager<IKeyEventListener> {
|
||||
|
||||
|
||||
private static var instance:KeyEventManager;
|
||||
|
||||
private var listeners:Array<IKeyEventListener>;
|
||||
|
||||
|
||||
public function new () {
|
||||
|
||||
listeners = new Array ();
|
||||
super ();
|
||||
|
||||
instance = this;
|
||||
|
||||
#if (cpp || neko)
|
||||
@@ -24,11 +24,11 @@ class KeyEventManager {
|
||||
}
|
||||
|
||||
|
||||
public static function addEventListener (listener:IKeyEventListener):Void {
|
||||
public static function addEventListener (listener:IKeyEventListener, priority:Int = 0):Void {
|
||||
|
||||
if (instance != null) {
|
||||
|
||||
instance.listeners.push (listener);
|
||||
instance._addEventListener (listener, priority);
|
||||
|
||||
}
|
||||
|
||||
@@ -62,6 +62,17 @@ class KeyEventManager {
|
||||
}
|
||||
|
||||
|
||||
public static function removeEventListener (listener:IKeyEventListener):Void {
|
||||
|
||||
if (instance != null) {
|
||||
|
||||
instance._removeEventListener (listener);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
#if (cpp || neko)
|
||||
private static var lime_key_event_manager_register = System.load ("lime", "lime_key_event_manager_register", 2);
|
||||
#end
|
||||
|
||||
@@ -1,20 +1,20 @@
|
||||
package lime.ui;
|
||||
|
||||
|
||||
import lime.app.EventManager;
|
||||
import lime.system.System;
|
||||
|
||||
|
||||
class MouseEventManager {
|
||||
class MouseEventManager extends EventManager<IMouseEventListener> {
|
||||
|
||||
|
||||
private static var instance:MouseEventManager;
|
||||
|
||||
private var listeners:Array<IMouseEventListener>;
|
||||
|
||||
|
||||
public function new () {
|
||||
|
||||
listeners = new Array ();
|
||||
super ();
|
||||
|
||||
instance = this;
|
||||
|
||||
#if (cpp || neko)
|
||||
@@ -24,11 +24,11 @@ class MouseEventManager {
|
||||
}
|
||||
|
||||
|
||||
public static function addEventListener (listener:IMouseEventListener):Void {
|
||||
public static function addEventListener (listener:IMouseEventListener, priority:Int = 0):Void {
|
||||
|
||||
if (instance != null) {
|
||||
|
||||
instance.listeners.push (listener);
|
||||
instance._addEventListener (listener, priority);
|
||||
|
||||
}
|
||||
|
||||
@@ -72,6 +72,17 @@ class MouseEventManager {
|
||||
}
|
||||
|
||||
|
||||
public static function removeEventListener (listener:IMouseEventListener):Void {
|
||||
|
||||
if (instance != null) {
|
||||
|
||||
instance._removeEventListener (listener);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
#if (cpp || neko)
|
||||
private static var lime_mouse_event_manager_register = System.load ("lime", "lime_mouse_event_manager_register", 2);
|
||||
#end
|
||||
|
||||
@@ -1,20 +1,20 @@
|
||||
package lime.ui;
|
||||
|
||||
|
||||
import lime.app.EventManager;
|
||||
import lime.system.System;
|
||||
|
||||
|
||||
class TouchEventManager {
|
||||
class TouchEventManager extends EventManager<ITouchEventListener> {
|
||||
|
||||
|
||||
private static var instance:TouchEventManager;
|
||||
|
||||
private var listeners:Array<ITouchEventListener>;
|
||||
|
||||
|
||||
public function new () {
|
||||
|
||||
listeners = new Array ();
|
||||
super ();
|
||||
|
||||
instance = this;
|
||||
|
||||
#if (cpp || neko)
|
||||
@@ -24,11 +24,11 @@ class TouchEventManager {
|
||||
}
|
||||
|
||||
|
||||
public static function addEventListener (listener:ITouchEventListener):Void {
|
||||
public static function addEventListener (listener:ITouchEventListener, priority:Int = 0):Void {
|
||||
|
||||
if (instance != null) {
|
||||
|
||||
instance.listeners.push (listener);
|
||||
instance._addEventListener (listener, priority);
|
||||
|
||||
}
|
||||
|
||||
@@ -70,6 +70,17 @@ class TouchEventManager {
|
||||
}
|
||||
|
||||
|
||||
public static function removeEventListener (listener:ITouchEventListener):Void {
|
||||
|
||||
if (instance != null) {
|
||||
|
||||
instance._removeEventListener (listener);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
#if (cpp || neko)
|
||||
private static var lime_touch_event_manager_register = System.load ("lime", "lime_touch_event_manager_register", 2);
|
||||
#end
|
||||
|
||||
@@ -15,7 +15,6 @@ import js.Browser;
|
||||
#end
|
||||
|
||||
|
||||
@:access(lime.graphics.RenderEventManager)
|
||||
class Window {
|
||||
|
||||
|
||||
@@ -23,6 +22,7 @@ class Window {
|
||||
public var height:Int;
|
||||
public var width:Int;
|
||||
|
||||
private var application:Application;
|
||||
#if js
|
||||
private var canvas:CanvasElement;
|
||||
#end
|
||||
@@ -30,7 +30,7 @@ class Window {
|
||||
|
||||
public function new (application:Application) {
|
||||
|
||||
|
||||
this.application = application;
|
||||
|
||||
}
|
||||
|
||||
@@ -171,7 +171,6 @@ class Window {
|
||||
|
||||
Browser.window.requestAnimationFrame (cast __render);
|
||||
*/
|
||||
render ();
|
||||
|
||||
#elseif (cpp || neko)
|
||||
handle = lime_window_create (application.handle);
|
||||
@@ -180,17 +179,6 @@ class Window {
|
||||
}
|
||||
|
||||
|
||||
#if js
|
||||
private function render ():Void {
|
||||
|
||||
RenderEventManager.instance.handleEvent (new RenderEvent ());
|
||||
|
||||
Browser.window.requestAnimationFrame (cast render);
|
||||
|
||||
}
|
||||
#end
|
||||
|
||||
|
||||
#if (cpp || neko)
|
||||
private static var lime_window_create = System.load ("lime", "lime_window_create", 1);
|
||||
#end
|
||||
|
||||
@@ -1,20 +1,20 @@
|
||||
package lime.ui;
|
||||
|
||||
|
||||
import lime.app.EventManager;
|
||||
import lime.system.System;
|
||||
|
||||
|
||||
class WindowEventManager {
|
||||
class WindowEventManager extends EventManager<IWindowEventListener> {
|
||||
|
||||
|
||||
private static var instance:WindowEventManager;
|
||||
|
||||
private var listeners:Array<IWindowEventListener>;
|
||||
|
||||
|
||||
public function new () {
|
||||
|
||||
listeners = new Array ();
|
||||
super ();
|
||||
|
||||
instance = this;
|
||||
|
||||
#if (cpp || neko)
|
||||
@@ -24,11 +24,11 @@ class WindowEventManager {
|
||||
}
|
||||
|
||||
|
||||
public static function addEventListener (listener:IWindowEventListener):Void {
|
||||
public static function addEventListener (listener:IWindowEventListener, priority:Int = 0):Void {
|
||||
|
||||
if (instance != null) {
|
||||
|
||||
instance.listeners.push (listener);
|
||||
instance._addEventListener (listener, priority);
|
||||
|
||||
}
|
||||
|
||||
@@ -62,6 +62,17 @@ class WindowEventManager {
|
||||
}
|
||||
|
||||
|
||||
public static function removeEventListener (listener:IWindowEventListener):Void {
|
||||
|
||||
if (instance != null) {
|
||||
|
||||
instance._removeEventListener (listener);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
#if (cpp || neko)
|
||||
private static var lime_window_event_manager_register = System.load ("lime", "lime_window_event_manager_register", 2);
|
||||
#end
|
||||
|
||||
@@ -48,33 +48,6 @@ class ApplicationMain {
|
||||
|
||||
}
|
||||
|
||||
untyped __js__ ("
|
||||
var lastTime = 0;
|
||||
var vendors = ['ms', 'moz', 'webkit', 'o'];
|
||||
for(var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {
|
||||
window.requestAnimationFrame = window[vendors[x]+'RequestAnimationFrame'];
|
||||
window.cancelAnimationFrame = window[vendors[x]+'CancelAnimationFrame']
|
||||
|| window[vendors[x]+'CancelRequestAnimationFrame'];
|
||||
}
|
||||
|
||||
if (!window.requestAnimationFrame)
|
||||
window.requestAnimationFrame = function(callback, element) {
|
||||
var currTime = new Date().getTime();
|
||||
var timeToCall = Math.max(0, 16 - (currTime - lastTime));
|
||||
var id = window.setTimeout(function() { callback(currTime + timeToCall); },
|
||||
timeToCall);
|
||||
lastTime = currTime + timeToCall;
|
||||
return id;
|
||||
};
|
||||
|
||||
if (!window.cancelAnimationFrame)
|
||||
window.cancelAnimationFrame = function(id) {
|
||||
clearTimeout(id);
|
||||
};
|
||||
|
||||
window.requestAnimFrame = window.requestAnimationFrame;
|
||||
");
|
||||
|
||||
var app = new ::APP_MAIN:: ();
|
||||
|
||||
var config:lime.app.Config = {
|
||||
|
||||
Reference in New Issue
Block a user