接着上一篇关于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