OSDN Git Service

proper axis indexing. seems like the left trigger on my ouya controller doesn't go...
authorMario Zechner <contact@badlogicgames.com>
Wed, 9 Jan 2013 15:53:03 +0000 (16:53 +0100)
committerMario Zechner <contact@badlogicgames.com>
Wed, 9 Jan 2013 15:53:03 +0000 (16:53 +0100)
extensions/gdx-controllers/gdx-controllers-android/src/com/badlogic/gdx/controllers/android/AndroidController.java
extensions/gdx-controllers/gdx-controllers-android/src/com/badlogic/gdx/controllers/android/AndroidControllers.java
extensions/gdx-controllers/gdx-controllers/src/com/badlogic/gdx/controllers/Controller.java

index 3156df6..dc558a0 100755 (executable)
@@ -1,5 +1,8 @@
 package com.badlogic.gdx.controllers.android;\r
 \r
+import android.view.InputDevice;\r
+import android.view.InputDevice.MotionRange;\r
+\r
 import com.badlogic.gdx.controllers.ControlType;\r
 import com.badlogic.gdx.controllers.Controller;\r
 import com.badlogic.gdx.controllers.ControllerListener;\r
@@ -15,12 +18,30 @@ public class AndroidController implements Controller {
        private boolean attached;\r
        private final String name;\r
        protected final IntIntMap buttons = new IntIntMap();\r
-       protected final IntFloatMap axes = new IntFloatMap();\r
+       protected final float[] axes;\r
+       protected final int[] axesIds;\r
        private final Array<ControllerListener> listeners = new Array<ControllerListener>();\r
        \r
        public AndroidController(int deviceId, String name) {\r
                this.deviceId = deviceId;\r
                this.name = name;\r
+               \r
+               InputDevice device = InputDevice.getDevice(deviceId);\r
+               int numAxes = 0;\r
+               for (MotionRange range : device.getMotionRanges()) {\r
+                       if ((range.getSource() & InputDevice.SOURCE_CLASS_JOYSTICK) != 0) {\r
+                               numAxes += 1;\r
+                       }\r
+               }\r
+\r
+               axesIds = new int[numAxes];\r
+               axes = new float[numAxes];\r
+               int i = 0;\r
+               for (MotionRange range : device.getMotionRanges()) {\r
+                       if ((range.getSource() & InputDevice.SOURCE_CLASS_JOYSTICK) != 0) {\r
+                               axesIds[i++] = range.getAxis();\r
+                       }\r
+               }\r
        }\r
 \r
        public boolean isAttached () {\r
@@ -76,7 +97,7 @@ public class AndroidController implements Controller {
 \r
        @Override\r
        public float getAxis (int axisIndex) {\r
-               return axes.get(axisIndex, 0);\r
+               return axes[axisIndex];\r
        }\r
 \r
        @Override\r
index bba06e0..84f5170 100755 (executable)
@@ -60,7 +60,6 @@ public class AndroidControllers implements PauseResumeListener, ControllerManage
                        public void run () {\r
                                synchronized(eventQueue) {\r
                                        for(AndroidControllerEvent event: eventQueue) {\r
-                                               Gdx.app.log(TAG, "received event");\r
                                                switch(event.type) {\r
                                                        case AndroidControllerEvent.CONNECTED:\r
                                                                controllers.add(event.controller);\r
@@ -96,7 +95,7 @@ public class AndroidControllers implements PauseResumeListener, ControllerManage
                                                                }\r
                                                                break;\r
                                                        case AndroidControllerEvent.AXIS:\r
-                                                               event.controller.axes.put(event.code, event.axisValue);\r
+                                                               event.controller.axes[event.code] = event.axisValue;\r
                                                                for(ControllerListener listener: listeners) {\r
                                                                        if(listener.axisMoved(event.controller, event.code, event.axisValue)) break;\r
                                                                }\r
@@ -121,19 +120,21 @@ public class AndroidControllers implements PauseResumeListener, ControllerManage
                if(controller != null) {\r
                        synchronized(eventQueue) {\r
                                final int historySize = motionEvent.getHistorySize();\r
-                               InputDevice device = InputDevice.getDevice(controller.getDeviceId());\r
-                               List<MotionRange> motionRanges = device.getMotionRanges();\r
-            for (int axisIndex = 0; axisIndex < motionRanges.size(); axisIndex++) {\r
-               float axisValue = motionEvent.getAxisValue(axisIndex);\r
+                               int axisIndex = 0;\r
+            for (int axisId: controller.axesIds) {\r
+               float axisValue = motionEvent.getAxisValue(axisId);\r
                if(controller.getAxis(axisIndex) == axisValue) {\r
+                       Gdx.app.log(TAG, "skipped axis " + axisIndex + ", " + axisValue);\r
+                       axisIndex++;\r
                        continue;\r
                }\r
                AndroidControllerEvent event = eventPool.obtain();\r
                                event.type = AndroidControllerEvent.AXIS;\r
                                event.controller = controller;\r
                                event.code = axisIndex;\r
-                               event.axisValue = motionEvent.getAxisValue(axisIndex);\r
+                               event.axisValue = axisValue;\r
                                eventQueue.add(event);\r
+                               axisIndex++;\r
             }\r
                        }\r
                        return true;\r
index d2a7111..7cc015c 100644 (file)
@@ -38,4 +38,11 @@ public interface Controller {
        public void addListener (ControllerListener listener);
 
        public void removeListener (ControllerListener listener);
+       
+       public static class Ouya {
+//             public static final int BUTTON_O;
+//             public static final int BUTTON_U;
+//             public static final int BUTTON_Y;
+//             public static final int BUTTON_A;
+       }
 }
\ No newline at end of file