用psychtoolbox获取按键KbGet——使用例程改动

用psychtoolbox获取按键KbGet——使用例程改动

接着上一篇关于KbGet的代码详解,我发现网上给出的使用例程对新手不是很友好,所以我写了一个比较适合我自己调试的版本。

例程改动1

%原文 http://my.oschina.net/u/1387924/blog/379421
%alsa_shui改动

close all;
clearvars;
sca;

try
PsychDefaultSetup(2);

screenNumber = max(Screen('Screens'));

white = WhiteIndex(screenNumber);

grey = white / 2;

black = BlackIndex(screenNumber);

Screen('Preference', 'SkipSyncTests', 1);

[winPt, winRect] = PsychImaging('OpenWindow', screenNumber, grey);

topPriorityLevel = MaxPriority(winPt);

Priority(topPriorityLevel);

[screenXpixels,screenYpixels]=Screen('windowSize',winPt);

[xCenter,yCenter] = RectCenter(winRect);

Screen('TextSize', winPt, 60);

KbName('UnifyKeyNames');

keyUp = KbName('UpArrow');

keyDown = KbName('DownArrow');

keyLeft = KbName('LeftArrow');

keyRight = KbName('RightArrow');

lastsecs = 0;

key = 0;

disp_txt = '';

DrawFormattedText(winPt,'play as you like,press esc to escape','center','center',black);

Screen('Flip',winPt);

while key ~= KbName('Escape')

    [secs, key] = KbGet();

    if key == keyUp

        disp_txt = 'up';

    elseif key == keyDown

        disp_txt = 'down';

    elseif key == keyLeft

        disp_txt = 'left';

    elseif key == keyRight

        disp_txt = 'right';

    elseif key ~= 0

        disp_txt = ['you presssed ' KbName(key)];

    end

    DrawFormattedText(winPt,disp_txt,'center','center',black);

    time = secs - lastsecs;

    DrawFormattedText(winPt,['the time duration is '  num2str(time)  's'],'center',screenYpixels*0.75 ,black);
    
    Screen('Flip',winPt);

    lastsecs = secs;

end

Screen('CloseAll');

catch
Screen('CloseAll');
Priority(0);
psychrethrow(psychlasterror);
end

这个程序可是实现连续按键,并且实时反馈距离上一次按键的时间。我改动的结果可以让这个例程避免因为中文字符出现报错的情况。

例程改动2

%原文 http://my.oschina.net/u/1387924/blog/379421
%alsa_shui改动
close all;
clearvars;
sca;

try
PsychDefaultSetup(2);

screenNumber = max(Screen('Screens'));

white = WhiteIndex(screenNumber);

grey = white / 2;

black = BlackIndex(screenNumber);

Screen('Preference', 'SkipSyncTests', 1);

[winPt, winRect] = PsychImaging('OpenWindow', screenNumber, grey);

topPriorityLevel = MaxPriority(winPt);

Priority(topPriorityLevel);

[screenXpixels,screenYpixels]=Screen('windowSize',winPt);

[xCenter,yCenter] = RectCenter(winRect);

Screen('TextSize', winPt, 60);

Screen('Preference','TextEncodingLocale','UTF8');

Screen('TextFont',winPt,'Simsun');

KbName('UnifyKeyNames');

keyUp = KbName('UpArrow');

keyDown = KbName('DownArrow');

keyLeft = KbName('LeftArrow');

keyRight = KbName('RightArrow');

lastsecs = 0;

key = 0;

disp_txt = '';

Screen('DrawText',winPt,double('随便玩,按esc退出'),xCenter,yCenter,black);

Screen('Flip',winPt);

while key ~= KbName('Escape')

    [secs, key] = KbGet();

    if key == keyUp

        disp_txt = 'up';

    elseif key == keyDown

        disp_txt = 'down';

    elseif key == keyLeft

        disp_txt = 'left';

    elseif key == keyRight

        disp_txt = 'right';

    elseif key ~= 0

        disp_txt = ['你按下了 ' KbName(key)];

    end

    Screen('DrawText',winPt,double(disp_txt),xCenter,yCenter,black);

    time = secs - lastsecs;

    Screen('DrawText',winPt,double(['距离上次按键 ' num2str(time) '秒']),xCenter,screenYpixels*0.75,black);
    
    Screen('Flip',winPt);

    lastsecs = secs;

end

Screen('CloseAll');

catch
Screen('CloseAll');
Priority(0);
psychrethrow(psychlasterror);
end

这个改动结果使得中文能够顺利得显示。用到的方法参照了知乎答案:
zhihu.com/question/41862021

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值