【问题标题】:Input from PS3 controller in OpenFL?OpenFL中PS3控制器的输入?
【发布时间】:2017-02-12 20:06:49
【问题描述】:

这是我目前正在使用的代码。 (不是我自己的)。它检测控制器何时插入,并输出一些相关信息。我不知道如何访问按钮数据。虽然它成功识别出我已插入 PS3 控制器,但查询时按钮的值似乎没有改变。

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");
    }

}

【问题讨论】:

  • 我不清楚您提到的“查询时”部分是如何处理的 - 您发布的代码 sn-p 只是检查 DEVICE_ADDED 事件的按钮状态,该事件应该只触发一次。
  • 我无法实现任何代码来查询按钮状态,因为我尝试的方法不起作用。我添加了一个 enterframe 事件循环,它打印出 PS3 控制器的所有 21 个按钮的值。起初它会打印出所有的 0,所以它可以获取一个值,但是当按下控制器上的任何按钮时,这些值都不会改变。这就是我没有包含它的原因,因为我的方法可能到目前为止是错误的。

标签: haxe openfl ps3


【解决方案1】:

这是获取控制器输入所需的最少代码量。它适用于我所有可用的控制器(Xbox 360、Xbox 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]);
        });
    }
}

这似乎与您尝试的非常相似,所以我会说这很可能是驱动程序问题,而不是您的代码问题。注意:我使用 OpenFL 4.7.3 和 Lime 3.7.2 进行测试。

我自己没有 PS3 控制器,但据说在 PC 上工作很难。 ScpToolkit 经常被推荐并且似乎很受欢迎。

顺便说一句,openfl-samples 也有一个 GamepadInput 示例,您可以尝试一下。

【讨论】:

  • 这非常适合我的 Xbox One 控制器(非常感谢您!)。不幸的是,它不适用于 PS3 控制器,我不知道为什么。
  • 我错过了驱动程序菜单中的一个选项 - 此解决方案完美运行。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-23
相关资源
最近更新 更多