我正在尝试使用Matlab上的Psychtoolbox获得单击的x,y坐标。我的程序需要执行以下操作: 1.在用户单击的地方放置一个点。 2.将此单击的x,y位置和所有后续单击存储在单个数组中。 3.最后,当检测到键盘按下时,程序应退出。
这是该程序的代码:
clear all;
%Set up a full screen with cursor
Screen('Preference', 'SkipSyncTests', 2);
[EXPWIN, scr_rect] = Screen('OpenWindow', 1);
ShowCursor('CrossHair', EXPWIN);
%General variable setup
clicks = 0;
black = [1,0,0];
nchunk = 1; % Chunk number
%main loop
while ~KbCheck %check keyboard has not been pressed
[nclicks, mousx, mousy, buttons] =GetClicks(EXPWIN, 0); %Click loc
%[mousx, mousy, buttons] =GetMouse(EXPWIN); %alternate click loc
if any(buttons)
clicks = clicks+1
[x,y] = GetMouse;
aoi_corners(nchunk, clicks)= x;
aoi_corners(nchunk, clicks+1)= y;
Screen('DrawDots', EXPWIN, [x, y], [10], black)
Screen('Flip', EXPWIN, 0, 1)
end
end
sca;
从本质上讲,问题是,如果我使用getclicks获取x,y坐标,则可以在aoi_corners矩阵中为该点获得良好的x,y坐标,因为它在释放按钮时取x,y。但是,它使KbCheck停止运行(我的搜索告诉我这是因为它像KbCheck一样运行,并在等待更多点击时暂停程序?)。
另一方面,使用getmouse可以使KbCheck正常工作,但是从按下按钮的点开始获取x,y坐标,因此即使我按下并释放了该按钮,它也会返回不需要的负载值尽可能快地按下按钮。
然后我的问题是如何解决这个问题?我是否错过了一些显而易见的事情/严重地编写了代码?
感谢您的帮助,
马丁
答案 0 :(得分:0)
GetClicks的问题在于,如您所述,在等待单击时未检查键盘。但是例如,当您单击鼠标时按住一个键会跳出循环。
如果您改用GetMouse,但还要等到按钮释放后再继续操作,我想您将获得所需的行为。我注意到的另一件事(不是您的原始问题)是,每次单击都将click
变量迭代1,但保存的是X和Y位置以供单击,然后单击+ 1 。在这种情况下,单击1 X和Y将位于位置1和2,但是单击2 X和Y将位于位置2和3,因此第一次单击的Y将被第二次单击的X覆盖,依此类推在我的示例中,我将X和Y保存为aoi_corners的三维尺寸。
clear all;
%Set up a full screen with cursor
Screen('Preference', 'SkipSyncTests', 2);
[EXPWIN, scr_rect] = Screen('OpenWindow', 1);
ShowCursor('CrossHair', EXPWIN);
%General variable setup
clicks = 0;
black = [1,0,0];
nchunk = 1; % Chunk number
%main loop
while ~KbCheck %check keyboard has not been pressed
[x, y, buttons] =GetMouse(EXPWIN); %alternate click loc
if any(buttons)
clicks = clicks+1;
aoi_corners(nchunk, clicks, 1)= x;
aoi_corners(nchunk, clicks, 2)= y;
Screen('DrawDots', EXPWIN, [x, y], [10], black)
Screen('Flip', EXPWIN, 0, 1)
% wait until the mouse is released
while(any(buttons))
[~, ~, buttons] =GetMouse(EXPWIN);
WaitSecs(.001); % wait 1 ms
end
end
end
sca;