Parcourir la source

integrated hxsl events and fullScreen

Nicolas Cannasse il y a 10 ans
Parent
commit
c415a45823
3 fichiers modifiés avec 121 ajouts et 15 suppressions
  1. 12 0
      hxd/Key.hx
  2. 10 13
      hxd/Stage.hx
  3. 99 2
      hxd/System.hx

+ 12 - 0
hxd/Key.hx

@@ -67,6 +67,18 @@ class Key {
 	public static inline var MOUSE_LEFT = 0;
 	public static inline var MOUSE_RIGHT = 1;
 
+	/** a bit that is set for left keys **/
+	public static inline var LOC_LEFT = 256;
+	/** a bit that is set for right keys **/
+	public static inline var LOC_RIGHT = 512;
+
+	public static inline var LSHIFT = SHIFT | LOC_LEFT;
+	public static inline var RSHIFT = SHIFT | LOC_RIGHT;
+	public static inline var LCTRL = CTRL | LOC_LEFT;
+	public static inline var RCTRL = CTRL | LOC_RIGHT;
+	public static inline var LALT = ALT | LOC_LEFT;
+	public static inline var RALT = ALT | LOC_RIGHT;
+
 	static var initDone = false;
 	static var keyPressed : Array<Int> = [];
 

+ 10 - 13
hxd/Stage.hx

@@ -142,6 +142,11 @@ class Stage {
 		#end
 	}
 
+	function onResize(e:Dynamic) {
+		for( r in resizeEvents )
+			r();
+	}
+
 	public function setFullScreen( v : Bool ) {
 		#if flash
 		var isAir = flash.system.Capabilities.playerType == "Desktop";
@@ -156,7 +161,9 @@ class Stage {
 			}
 			stage.displayState = state;
 		}
-		#else
+		#elseif hxsdl
+		var win = @:privateAccess System.win;
+		win.fullScreen = v;
 		#end
 	}
 
@@ -200,11 +207,6 @@ class Stage {
 		#end
 	}
 
-	function onResize(_) {
-		for( e in resizeEvents )
-			e();
-	}
-
 	function onMouseDown(e:Dynamic) {
 		event(new Event(EPush, mouseX, mouseY));
 	}
@@ -386,19 +388,14 @@ class Stage {
 		event(ev);
 	}
 
-	function onResize(e) {
-		for( r in resizeEvents )
-			r();
-	}
-
 #elseif hxsdl
 
 	function get_mouseX() {
-		return 0;
+		return @:privateAccess System.mouseX;
 	}
 
 	function get_mouseY() {
-		return 0;
+		return @:privateAccess System.mouseY;
 	}
 
 	function get_width() {

+ 99 - 2
hxd/System.hx

@@ -1,5 +1,9 @@
 package hxd;
 
+#if hxsdl
+import hxd.Key in K;
+#end
+
 enum Cursor {
 	Default;
 	Button;
@@ -341,7 +345,10 @@ class System {
 	static var win : sdl.Window;
 	static var windowWidth = 800;
 	static var windowHeight = 600;
+	static var mouseX = 0;
+	static var mouseY = 0;
 	static var currentLoop = null;
+	static var CODEMAP = [for( i in 0...2048 ) i];
 
 	public static function setLoop( f : Void -> Void ) {
 		currentLoop = f;
@@ -352,12 +359,102 @@ class System {
 		win.present();
 	}
 
+	static function onEvent( e : sdl.Event ) {
+		var eh = null;
+		switch( e.type ) {
+		case WindowState:
+			switch( e.state ) {
+			case Resize:
+				windowWidth = win.width;
+				windowHeight = win.height;
+				@:privateAccess Stage.getInstance().onResize(null);
+			default:
+			}
+		case MouseDown:
+			mouseX = e.mouseX;
+			mouseY = e.mouseY;
+			eh = new Event(EPush, e.mouseX, e.mouseY);
+		case MouseUp:
+			mouseX = e.mouseX;
+			mouseY = e.mouseY;
+			eh = new Event(ERelease, e.mouseX, e.mouseY);
+		case MouseMove:
+			mouseX = e.mouseX;
+			mouseY = e.mouseY;
+			eh = new Event(EMove, e.mouseX, e.mouseY);
+		case KeyDown:
+			eh = new Event(EKeyDown);
+			if( e.keyCode & (1 << 30) != 0 ) e.keyCode = (e.keyCode & ((1 << 30) - 1)) + 1000;
+			eh.keyCode = CODEMAP[e.keyCode];
+			if( eh.keyCode & (K.LOC_LEFT | K.LOC_RIGHT) != 0 ) {
+				e.keyCode = eh.keyCode & 0xFF;
+				onEvent(e);
+			}
+		case KeyUp:
+			eh = new Event(EKeyUp);
+			if( e.keyCode & (1 << 30) != 0 ) e.keyCode = (e.keyCode & ((1 << 30) - 1)) + 1000;
+			eh.keyCode = CODEMAP[e.keyCode];
+			if( eh.keyCode & (K.LOC_LEFT | K.LOC_RIGHT) != 0 ) {
+				e.keyCode = eh.keyCode & 0xFF;
+				onEvent(e);
+			}
+		case MouseWheel:
+			eh = new Event(EWheel, mouseX, mouseY);
+			eh.wheelDelta = -e.wheelDelta;
+		default:
+		}
+		if( eh != null ) Stage.getInstance().event(eh);
+	}
+
 	public static function start( init : Void -> Void ) {
+		inline function addKey(sdl, keyCode) {
+			CODEMAP[sdl] = keyCode;
+		}
+		var keys = [
+			//K.BACKSPACE
+			//K.TAB
+			//K.ENTER
+			1225 => K.LSHIFT,
+			1229 => K.RSHIFT,
+			1224 => K.LCTRL,
+			1228 => K.RCTRL,
+			1226 => K.LALT,
+			1230 => K.RALT,
+			// K.ESCAPE
+			// K.SPACE
+			1075 => K.PGUP,
+			1078 => K.PGDOWN,
+			1077 => K.END,
+			1074 => K.HOME,
+			1080 => K.LEFT,
+			1082 => K.UP,
+			1079 => K.RIGHT,
+			1081 => K.DOWN,
+			1073 => K.INSERT,
+			127 => K.DELETE,
+			//K.NUMBER_0-9
+			1098 => K.NUMPAD_0,
+			//K.A-Z
+			//K.F1-F12
+			1085 => K.NUMPAD_MULT,
+			1087 => K.NUMPAD_ADD,
+			1088 => K.NUMPAD_ENTER,
+			1086 => K.NUMPAD_SUB,
+			1099 => K.NUMPAD_DIV,
+			1084 => K.NUMPAD_DIV,
+		];
+		for( i in 0...9 )
+			addKey(1089 + i, K.NUMPAD_1 + i);
+		for( i in 0...26 )
+			addKey(97 + i, K.A + i);
+		for( i in 0...12 )
+			addKey(1058 + i, K.F1 + i);
+		for( sdl in keys.keys() )
+			addKey(sdl, keys.get(sdl));
 		sdl.Sdl.init();
 		win = new sdl.Window("", windowWidth, windowHeight);
-		win.vsync = false;
 		init();
-		sdl.Sdl.loop(mainLoop);
+		sdl.Sdl.loop(mainLoop,onEvent);
 		sdl.Sdl.quit();
 	}