-
-
Save jgranick/5888202 to your computer and use it in GitHub Desktop.
package; | |
import flash.display.Sprite; | |
import flash.geom.Point; | |
import openfl.events.JoystickEvent; | |
#if android | |
import openfl.utils.JNI; | |
import tv.ouya.console.api.OuyaController; | |
#end | |
class Main extends Sprite { | |
public function new () { | |
super (); | |
#if android | |
var getContext = JNI.createStaticMethod ("org.haxe.nme.GameActivity", "getContext", "()Landroid/content/Context;", true); | |
OuyaController.init (getContext ()); | |
#end | |
stage.addEventListener (JoystickEvent.AXIS_MOVE, stage_onJoystickAxisMove); | |
stage.addEventListener (JoystickEvent.BUTTON_DOWN, stage_onJoystickButtonDown); | |
stage.addEventListener (JoystickEvent.BUTTON_UP, stage_onJoystickButtonUp); | |
stage.addEventListener (JoystickEvent.HAT_MOVE, stage_onJoystickHatMove); | |
} | |
// Event Handlers | |
private function stage_onJoystickAxisMove (event:JoystickEvent):Void { | |
var player = OuyaController.getPlayerNumByDeviceId (event.device); | |
var leftX = event.x; // event.axis[0]; | |
var leftY = event.y; // event.axis[1]; | |
var rightX = event.axis[3]; | |
var rightY = event.axis[4]; | |
} | |
private function stage_onJoystickButtonDown (event:JoystickEvent):Void { | |
var player = OuyaController.getPlayerNumByDeviceId (event.device); | |
var buttonCode = event.id; | |
} | |
private function stage_onJoystickButtonUp (event:JoystickEvent):Void { | |
var player = OuyaController.getPlayerNumByDeviceId (event.device); | |
var buttonCode = event.id; | |
} | |
private function stage_onJoystickHatMove (event:JoystickEvent):Void { | |
var player = OuyaController.getPlayerNumByDeviceId (event.device); | |
var left = (event.x < 0); | |
var right = (event.x > 0); | |
var up = (event.y < 0); | |
var down = (event.y > 0); | |
} | |
} |
The id drift is occuring even using their ODK if you have a usb controller.keyboard plugged in when using the function getPlayerNumByDeviceId. I reported the id drift two months ago to OUYA - no move yet on their end.
What we really need to implement is if its just to use the getPlayerNumByDeviceId thingy -
-
A poll function to know what joystick devices are connected to the system at an instant T.
in MainView.java we can put InputDevice.getDeviceIds() -> returns an array of connected devices.
according to this array, we can get infos: device = InputDevice.getDeviceId() and trace its name with device.getName().
implement this in a function call in OpenFL to get this array at any time,
like extending nme.system with nme.system.Joysticks with a function of getConnectedJoysticks returning [[deviceId, StringId],[deviceId, StringId],[deviceIdN, StringIdN]] -
Whenever a new device is connected, it pushes something in the pipe. Extending nme.events with NewJoystickConnected returning [deviceId,StringId]
I'll try to implement this.
I implemented the poll function and more - and simplified the overall process - we can ditch getPlayerNumByDeviceId totally. http://www.nme.io/download_file/592/8014/
When you a target a newer Android API, OpenFL will be able to dispatch JoystickEvents on Android, similar to desktop platforms. On OUYA, it can be difficult to map the device ID to the player, so the OuyaController class is helpful.
To add it, install "openfl-ouya" from haxelib, then put <haxelib name="openfl-ouya" /> in your project file.