haxeopenflplaystation3

Input from PS3 controller in OpenFL?


This is the code I'm currently using. (Not my own). It detects when a controller has been plugged in, and outputs a few bits of relevant info. What I can't figure out is how to access the button data. Although it successfully recognises I've plugged in a PS3 controller, the values of the buttons don't seem to change when queried.

package;

import openfl.display.Sprite;
import openfl.events.GameInputEvent;
import openfl.ui.GameInputControl;
import openfl.ui.GameInputDevice;
import openfl.ui.GameInput;
import openfl.events.Event;

class Main extends Sprite {

    private var gameInput:GameInput;

    public function new(){
        super();
        gameInput = new GameInput();
        gameInput.addEventListener(GameInputEvent.DEVICE_ADDED, controllerAdded);
        gameInput.addEventListener(GameInputEvent.DEVICE_REMOVED, controllerRemoved);
        gameInput.addEventListener(GameInputEvent.DEVICE_UNUSABLE, controllerProblem);
    }

    function controllerAdded(e:GameInputEvent){
        //put code here to handle when a device is added

        trace("GameInput.numDevices: "+GameInput.numDevices);//tells you how many gamepads are plugged in
        var myDevice = GameInput.getDeviceAt(0);//1st gamepad is "0" - more gamepads would be "1", "2", "3", etc.
        trace("myDevice.numControls: "+myDevice.numControls); //tells you how many inputs/controls the device has
        myDevice.enabled = true; //enables the device

        var cont = myDevice.getControlAt(12);//input reference (AXIS STICK, BUTTON, TRIGGER, etc) "0" is the 1st input
        trace("id: "+cont.id);//the name of this control. Ex: "AXIS_0"
        trace("value: " + cont.value); //value of this control - Axis: -1 to 1, Button: 0 OR 1, Trigger: 0 to 1
        trace("cont: " + cont.device.name); //the name of the device. ie: "XBOX 360 Controller"
        trace("device: " + cont.device);
        trace("minValue: " + cont.minValue);//the minimum possible value for the control/input
        trace("maxValue: " + cont.maxValue);//the maximum possible value for the control/input
    }

    function controllerRemoved(e:GameInputEvent){
        trace('BLAH BLAH BLAH');
    }

    function controllerProblem(e:GameInputEvent){
        //put code here to handle when there is a problem with the controller
        trace("controller problem");
    }

}

Solution

  • Here's the minimum amount of code needed to get controller input. It works with all controllers I have available (Xbox 360, Xbox One and a Logitech one):

    import openfl.display.Sprite;
    import openfl.ui.GameInput;
    import openfl.ui.GameInputDevice;
    import openfl.events.Event;
    import openfl.events.GameInputEvent;
    
    class Main extends Sprite {
        public function new() {
            super();
            var gameInput = new GameInput();
            var device:GameInputDevice;
            gameInput.addEventListener(GameInputEvent.DEVICE_ADDED, function(event) {
                device = event.device;
                device.enabled = true;
            });
            stage.addEventListener(Event.ENTER_FRAME, function(event) {
                trace([for (i in 0...device.numControls) device.getControlAt(i).value]);
            });
        }
    }
    

    That seems quite similar to what you tried, so I'd say chances are it's a driver issue, not a problem with your code. Note: I used OpenFL 4.7.3 and Lime 3.7.2 for testing.

    I don't own a PS3 controller myself, but they're supposedly tricky to get to work on PC. ScpToolkit is often recommended and seems quite popular.

    Btw, openfl-samples also has a GamepadInput sample you could give a try.