首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Gamepad IO游戏手柄

Gamepad IO游戏手柄
EN

Stack Overflow用户
提问于 2014-09-12 23:07:13
回答 1查看 454关注 0票数 0

我在Windows1.80.07的独立PsychoPy中使用构建器。我正在尝试弄清楚如何创建一个代码组件来接收来自罗技F310游戏手柄的响应。理想情况下,我只想使用触发器。当我运行实验时,我没有得到任何错误代码(这是Stroop键盘IO演示,用以下代码替换了IO键盘代码组件代码)。它看起来运行得很好,但它只显示了第一次试验,并等待受试者的响应,就像它没有听到游戏手柄一样。此外,我能够运行XInput游戏手柄编码器演示,一切都很好。我是一个编程新手,所以如果能帮助我指出哪里出了错,我将不胜感激!

以下是我的Code组件中的内容:

代码语言:javascript
复制
#Begin Experiment

try:
    from psychopy import visual, core
    from psychopy.iohub import launchHubServer, EventConstants
    from psychopy.data import getDateStr

    kwargs={'psychopy_monitor_name':'default','xinput.Gamepad':{}}
    io=launchHubServer(**kwargs)
    gamepad=io.devices.gamepad
except Exception, e:
    import sys
    print "!! Error starting ioHub: ",e," Exiting..."
    sys.exit(1)

#Begin Routine

response_event=None
trial_start=0
io.clearEvents()

#Each Frame

if frameN == 0:
    io.clearEvents('all')
    trial_start=core.getTime()
else:
    gamepadState=gamepad.getEvents()
    for anyState in gamepadState:
        if anyState in [u'left_trigger',u'right_trigger']:
            response_event=gamepadState
            continueRoutine = False 
            break

#End Routine

trials.addData("trial_start_time", trial_start)
if response_event:
    trials.addData("resp.time", response_event.time)
    trials.addData("resp.rt", response_event.time-trial_start)
    trials.addData("resp.duration", response_event.duration)
    trials.addData('resp.keys',response_event.key)
    trials.addData('resp.corr', response_event.key.lower()==corrAns)
else:
    trials.addData("resp.time",-1.0)
    trials.addData("resp.rt", -1.0)
    trials.addData("resp.duration", -1.0)
    trials.addData('resp.keys','None')
    trials.addData('resp.corr', False)

#End Experiment

io.quit()
EN

回答 1

Stack Overflow用户

发布于 2014-09-16 06:10:34

如果想要获取游戏手柄上左触发器和右触发器的最新值,可以直接使用getTriggers()读取这些值,而不使用getEvents()。

getTriggers()将返回一个dict,其中包含iohub最后一次读取触发器的状态和读取这些值的时间。

例如,假设' gamepad‘是一个保存iohub xinput gamepad设备实例的变量:

代码语言:javascript
复制
gp_triggers = gamepad.getTriggers()
# psychopy time that the trigger values were actually read (in sec.msec)
trig_time = gp_triggers['time']
# values will be between 0.0 and 1.0. 0.0 = Not pressed at all; 1.0 = fully pressed.
left_val, right_val = gp_triggers['left_trigger'], gp_triggers['right_trigger'] 

然后在条件中使用left_val和right_val,这对于何时接受gamepad触发器状态作为响应是有意义的。例如,如果您希望在任一触发器被按下超过50%时接受响应:

代码语言:javascript
复制
if left_val > 0.5 and right_val > 0.5:
    # set some response vars like you were
    response = gp_triggers
    continueRoutine = False 
    break        

然后,在稍后的代码中,您可以再次访问响应dict的值:

代码语言:javascript
复制
resp_time = response['time']
left_val, right_val = response['left_trigger'], response['right_trigger'] 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25811363

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档