使用 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;
我正在尝试使用 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;