使用GetMouse / GetClick在psychtoolbox中获取单击的位置

时间:2018-09-24 16:21:05

标签: matlab mouse psychtoolbox

我正在尝试使用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坐标,因此即使我按下并释放了该按钮,它也会返回不需要的负载值尽可能快地按下按钮。

然后我的问题是如何解决这个问题?我是否错过了一些显而易见的事情/严重地编写了代码?

感谢您的帮助,

马丁

1 个答案:

答案 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;