diff --git a/lime/_backend/native/NativeApplication.hx b/lime/_backend/native/NativeApplication.hx index 45ed86112..a920f07ce 100644 --- a/lime/_backend/native/NativeApplication.hx +++ b/lime/_backend/native/NativeApplication.hx @@ -14,6 +14,7 @@ import lime.ui.Window; @:access(lime.app.Application) @:access(lime.graphics.Renderer) +@:access(lime.ui.Gamepad) class NativeApplication { @@ -116,25 +117,28 @@ class NativeApplication { case AXIS_MOVE: - parent.window.onGamepadAxisMove.dispatch (gamepadEventInfo.id, gamepadEventInfo.axis, gamepadEventInfo.value); + parent.window.onGamepadAxisMove.dispatch (Gamepad.devices.get (gamepadEventInfo.id), gamepadEventInfo.axis, gamepadEventInfo.value); case BUTTON_DOWN: - parent.window.onGamepadButtonDown.dispatch (gamepadEventInfo.id, gamepadEventInfo.button); + parent.window.onGamepadButtonDown.dispatch (Gamepad.devices.get (gamepadEventInfo.id), gamepadEventInfo.button); case BUTTON_UP: - parent.window.onGamepadButtonUp.dispatch (gamepadEventInfo.id, gamepadEventInfo.button); + parent.window.onGamepadButtonUp.dispatch (Gamepad.devices.get (gamepadEventInfo.id), gamepadEventInfo.button); case CONNECT: - Gamepad.devices.push (gamepadEventInfo.id); - parent.window.onGamepadConnect.dispatch (gamepadEventInfo.id); + var gamepad = new Gamepad (gamepadEventInfo.id); + Gamepad.devices.set (gamepadEventInfo.id, gamepad); + parent.window.onGamepadConnect.dispatch (gamepad); case DISCONNECT: + var gamepad = Gamepad.devices.get (gamepadEventInfo.id); + if (gamepad != null) gamepad.connected = false; Gamepad.devices.remove (gamepadEventInfo.id); - parent.window.onGamepadDisconnect.dispatch (gamepadEventInfo.id); + parent.window.onGamepadDisconnect.dispatch (gamepad); } diff --git a/lime/ui/Gamepad.hx b/lime/ui/Gamepad.hx index 38029c3a6..79616e13b 100644 --- a/lime/ui/Gamepad.hx +++ b/lime/ui/Gamepad.hx @@ -4,13 +4,24 @@ package lime.ui; import lime.system.System; -abstract Gamepad(Int) from Int to Int { +class Gamepad { - public static var devices = new Array (); + public static var devices = new Map (); + public var connected (default, null):Bool; public var guid (get, never):String; + public var id (default, null):Int; public var name (get, never):String; + public var player:Int; + + + public function new (id:Int) { + + this.id = id; + connected = true; + + } diff --git a/lime/ui/GamepadAxis.hx b/lime/ui/GamepadAxis.hx index fb3b88c9f..b216b0a79 100644 --- a/lime/ui/GamepadAxis.hx +++ b/lime/ui/GamepadAxis.hx @@ -3,11 +3,30 @@ package lime.ui; @:enum abstract GamepadAxis(Int) from Int to Int { - var LEFT_X = 1; - var LEFT_Y = 2; - var RIGHT_X = 3; - var RIGHT_Y = 4; - var TRIGGER_LEFT = 5; - var TRIGGER_RIGHT = 6; + + var LEFT_X = 0; + var LEFT_Y = 1; + var RIGHT_X = 2; + var RIGHT_Y = 3; + var TRIGGER_LEFT = 4; + var TRIGGER_RIGHT = 5; + + + public inline function toString ():String { + + return switch (this) { + + case LEFT_X: "LEFT_X"; + case LEFT_Y: "LEFT_Y"; + case RIGHT_X: "RIGHT_X"; + case RIGHT_Y: "RIGHT_Y"; + case TRIGGER_LEFT: "TRIGGER_LEFT"; + case TRIGGER_RIGHT: "TRIGGER_RIGHT"; + default: "UNKNOWN (" + this + ")"; + + } + + } + } \ No newline at end of file diff --git a/lime/ui/GamepadButton.hx b/lime/ui/GamepadButton.hx index 5404677b9..baddefc9e 100644 --- a/lime/ui/GamepadButton.hx +++ b/lime/ui/GamepadButton.hx @@ -3,20 +3,48 @@ package lime.ui; @:enum abstract GamepadButton(Int) from Int to Int { - var A = 1; - var B = 2; - var X = 3; - var Y = 4; - var BACK = 5; - var GUIDE = 6; - var START = 7; - var LEFT_STICK = 8; - var RIGHT_STICK = 9; - var LEFT_SHOULDER = 10; - var RIGHT_SHOULDER = 11; - var DPAD_UP = 12; - var DPAD_DOWN = 13; - var DPAD_LEFT = 14; - var DPAD_RIGHT = 15; + + var A = 0; + var B = 1; + var X = 2; + var Y = 3; + var BACK = 4; + var GUIDE = 5; + var START = 6; + var LEFT_STICK = 7; + var RIGHT_STICK = 8; + var LEFT_SHOULDER = 9; + var RIGHT_SHOULDER = 10; + var DPAD_UP = 11; + var DPAD_DOWN = 12; + var DPAD_LEFT = 13; + var DPAD_RIGHT = 14; + + + public inline function toString ():String { + + return switch (this) { + + case A: "A"; + case B: "B"; + case X: "X"; + case Y: "Y"; + case BACK: "BACK"; + case GUIDE: "GUIDE"; + case START: "START"; + case LEFT_STICK: "LEFT_STICK"; + case RIGHT_STICK: "RIGHT_STICK"; + case LEFT_SHOULDER: "LEFT_SHOULDER"; + case RIGHT_SHOULDER: "RIGHT_SHOULDER"; + case DPAD_UP: "DPAD_UP"; + case DPAD_DOWN: "DPAD_DOWN"; + case DPAD_LEFT: "DPAD_LEFT"; + case DPAD_RIGHT: "DPAD_RIGHT"; + default: "UNKNOWN (" + this + ")"; + + } + + } + } \ No newline at end of file diff --git a/project/src/backend/sdl/SDLApplication.cpp b/project/src/backend/sdl/SDLApplication.cpp index bc03fdba0..45952691c 100644 --- a/project/src/backend/sdl/SDLApplication.cpp +++ b/project/src/backend/sdl/SDLApplication.cpp @@ -210,7 +210,7 @@ namespace lime { case SDL_CONTROLLERAXISMOTION: - gamepadEvent.type = BUTTON_UP; + gamepadEvent.type = AXIS_MOVE; gamepadEvent.axis = event->caxis.axis; gamepadEvent.id = event->caxis.which; gamepadEvent.axisValue = event->caxis.value / 32768.0; diff --git a/templates/project/Project.hxproj b/templates/project/Project.hxproj index 6d1b7c5aa..591aa2807 100644 --- a/templates/project/Project.hxproj +++ b/templates/project/Project.hxproj @@ -2,48 +2,47 @@ - + - + - + + + - - + - - - - - + - + "$(CompilerPath)/haxelib" run lime build "$(OutputFile)" $(TargetBuild) -$(BuildConfig) -Dfdb