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

Using GetMouse/GetClick to get location of a click in 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 坐标,因为它在按钮释放点。但是它会阻止 KbCheck 工作(我的搜索告诉我这是因为它像 KbCheck 一样运行并在等待更多点击时暂停程序?)。

另一方面,使用 getmouse 允许 KbCheck 工作,但从按下按钮的点开始获取 x、y 坐标,因此它 returns 加载了我不需要的值,甚至如果我尽可能快地按下和释放按钮。

我的问题是我该如何解决这个问题?我是不是漏掉了什么 obvious/written 我的代码?

感谢您的帮助,

马丁

正如您所指出的,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;