Как установить длительность появления текстуры в Psychtoolbox?
Я новичок в Psychtoolbox и использую его для создания реверсивного шаблона шахматной доски на экране. Шахматная доска была раскрашена так, что она больше похожа на вертикальные полосы, чем на чеки. У меня есть два контрастных состояния: обычный черно-белый полосатый рисунок и затем светло-серый / темно-серый полосатый рисунок. Мне удалось сделать все, кроме того, что я действительно борюсь со временем.
Сначала я боролся с временным аспектом и не смог заставить экран переключиться с серого на черно-белый экран. Ожидание исправило это. Тем не менее, теперь, когда у меня есть каждый экран, появляющийся в течение заданной длительности, чередование шаблона остановилось для каждой текстуры. У кого-нибудь есть совет, как это исправить? Что отсутствует в моем коде в настоящее время, что останавливает изменение полосы?
Кто-нибудь может дать совет? Мой код ниже.
% Clear the workspace and the screen
sca;
close all;
clearvars;
PsychDefaultSetup(2);
screens = Screen('Screens');
screenNumber = max(screens);
white = WhiteIndex(screenNumber);
black = BlackIndex(screenNumber);
grey = white / 2;
% Open an on screen window
[window, windowRect] = PsychImaging('OpenWindow', screenNumber, grey, [0 0 400 400]);
ifi = Screen('GetFlipInterval', window);
% Query the maximum priority level
topPriorityLevel = MaxPriority(window);
[screenXpixels, screenYpixels] = Screen('WindowSize', window);
%Stripe information Get the centre coordinate of the window
[xCenter, yCenter] = RectCenter(windowRect);
cx = (screenXpixels/2);
cy = (screenYpixels/2);
% Make a base Rect of 200 by 200 pixels
dimx = cx;
dimy = cy;
baseRect = [0 0 dimx dimy];
pos = [cx- dimx/2 ,cy - dimy/2,cx+ dimx/2 ,cy + dimy/2];
[xPos, yPos] = meshgrid(-2:0.5:2, -2:0.5:2);
% Calculate the number of squares and reshape the matrices of coordinates
% into a vector
[s1, s2] = size(xPos);
numSquares = s1 * s2;
xPos = reshape(xPos, 1, numSquares);
yPos = reshape(yPos, 1, numSquares);
% Set the colors of each of our squares
%grey colours
bwColors = repmat([0.55 0.46; 0.55 0.46], 5, 5);
bwColors = bwColors(1:end-1, 1:end-1);
bwColors = reshape(bwColors, 1, numSquares);
bwColors = repmat(bwColors, 3, 1);
multiColors = repmat([0.45 0.58; 0.45 0.58], 5, 5);
multiColors = multiColors(1:end-1, 1:end-1);
multiColors = reshape( multiColors, 1, numSquares);
multiColors = repmat( multiColors, 3, 1);
%black and white colours
board3 = repmat([1 0; 1 0], 5, 5);
board3 = board3(1:end-1, 1:end-1);
board3 = reshape(board3, 1, numSquares);
board3 = repmat(board3, 3, 1);
board4 = repmat([0 1; 0 1], 5, 5);
board4 = board4(1:end-1, 1:end-1);
board4 = reshape( board4, 1, numSquares);
board4 = repmat( board4, 3, 1);
% Texture cue that determines which texture we will show
textureCue = [1 2];
% Sync us to the vertical retrace
vbl = Screen('Flip', window);
%Timing
% Time we want to wait before reversing the contrast of the checkerboard
checkFlipTimeSecs = 0.5;
checkFlipTimeFrames = round(checkFlipTimeSecs / ifi);
frameCounter = 0;
flipSecs = 12;
waitframes = round(flipSecs / ifi);
% Keybpard setup
spaceKey = KbName('space');
escapeKey = KbName('ESCAPE');
RestrictKeysForKbCheck([spaceKey escapeKey]);
%Experimental loop
% Start screen
DrawFormattedText(window, 'Press Space To Begin', 'center', 'center', black);
Screen('Flip', window);
KbWait;
numTrials = 10;
for trial=1:numTrials
textureCue = [1 2];
tex(1)= Screen('MakeTexture',window,multiColors);
tex(2)= Screen('MakeTexture',window,bwColors);
tex2(1)=Screen('MakeTexture',window,board3);
tex2(2)=Screen('MakeTexture',window,board4);
Screen('FillRect', window, grey);
Screen('Flip', window);
% This is our drawing loop
Priority(topPriorityLevel);
while ~KbCheck
% Draw the textures or a blank frame
frameCounter = frameCounter + 1;
if frameCounter == checkFlipTimeFrames
textureCue = fliplr(textureCue);
frameCounter = 0;
end
Screen('DrawTexture', window, tex(textureCue(1)), [],pos);
vbl = Screen('Flip', window, vbl + (waitframes - 0.5) * ifi);
frameCounter = frameCounter + 1;
if frameCounter == checkFlipTimeFrames
textureCue = fliplr(textureCue);
frameCounter = 0;
end
Screen('DrawTexture', window, tex2(textureCue(1)), [],pos);
vbl = Screen('Flip', window, vbl + (waitframes - 0.5) * ifi);
% Poll the keyboard for the space key
[keyIsDown, secs, keyCode] = KbCheck(-1);
if keyCode(KbName('space')) == 1
respMade = 1;
elseif keyCode(KbName('ESCAPE')) == 1
sca;
disp('*** Experiment terminated ***');
return
end
end
end
Screen('Close', tex);
Screen('Close', tex2);
sca;