2017-02-12 30 views
2

这是我目前使用的代码。 (不是我自己的)。它检测控制器何时插入,并输出一些相关信息。我无法弄清楚的是如何访问按钮数据。虽然它成功识别出我插入PS3控制器,但查询时按钮的值似乎没有变化。来自OpenFL中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"); 
    } 

} 
+0

我不清楚你提到的“何时查询”部分是如何处理的 - 你发布的代码片段只是检查'DEVICE_ADDED'事件的按钮状态,它应该只触发一次。 – Gama11

+0

我还没有能够实现任何代码来查询按钮状态,因为我试过的东西不起作用。我添加了一个enterframe事件循环,打印出所有21个PS3控制器按钮的值。首先它打印出所有的0,所以很好,它会提取一个值,但是当控制器上按下任何按钮时,没有任何值会改变。这就是为什么我没有包括它,因为我的方法可能是错误的。 – k13ran

回答

2

这里的代码来获取控制器输入所需的最低量。它适用于所有控制器我有可用(的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样本也有一个GamepadInput样本,你可以试试看。

+0

这适用于我的Xbox One控制器(非常感谢你!)。不幸的是,它不适用于PS3控制器,我不知道为什么。 – k13ran

+0

您是否尝试过安装我链接的驱动程序? – Gama11

+1

我错过了驱动程序菜单中的一个选项 - 此解决方案完美*工作。非常感谢! – k13ran