Подождите, пока пользователь не нажмет клавишу

Я делаю проект, в котором у меня есть визуальный стимул, состоящий из множества точек, движущихся по экрану в определенном направлении, и после стимула пользователю нужно нажать одну из двух клавиш (либо «q», либо «w» ).

Я хочу, чтобы пользователь был вынужден нажимать клавишу, то есть: стимул (точки, движущиеся в определенном направлении) воспроизводится в течение фиксированного времени, затем он останавливается (но точки продолжают двигаться в случайных направлениях), и он просто остается таким пока пользователь не нажмет «q» или «w». После того, как пользователь, наконец, нажимает клавишу, раздается звуковая обратная связь (правильный или неправильный ответ), и стимул воспроизводится снова. Так повторяется до конца испытаний.

Мой вопрос: как я могу заставить пользователя нажимать клавишу после стимула без паузы? Потому что, если я делаю паузу, все точки «замирают», вместо того, чтобы двигаться в разных/случайных направлениях в ожидании ответа. Итак, как я могу ждать «вечно/бесконечно», пока пользователь не нажмет клавишу («q» или «w»)?

Мой код:

% present dots in random directions:
for frame = 1:ceil(maxRT*frameRate) %maxRT is 2 seconds
        %calls function related to the drawing of the dots            
        Screen('DrawingFinished', window1.h);
            [flip.waitRT.VBL(block, trial, frame), ...
                flip.waitRT.StimOns(block, trial, frame), ...
                flip.waitRT.FlipTS(block, trial, frame), ...
                flip.waitRT.Missed(block, trial, frame), ...
                flip.waitRT.beampos(block, trial, frame)] = Screen('Flip', window1.h, TimingCnt);
            TimingCnt = flip.waitRT.VBL(block, trial, frameNum) + window1.frameDur - window1.slack; 

        [keyIsDown, secs, keyCode]  = KbCheck();
        keypressed = KbName(keyCode);
        if ischar(keypressed) && ~isempty(keypressed) && keyIsDown
            %checks which key was pressed, compares pressed key with correct key to check if it's correct or wrong, calculates RT, plays auditory feedback
        end
end

person Bear    schedule 21.02.2020    source источник


Ответы (1)


http://psychtoolbox.org/docs/KbWait

Используйте функцию KbWait в цикле while, предоставляя параметр untilTime равным 10 мс. Если keyCode действителен, сделайте перерыв и действуйте соответствующим образом.

Пример псевдокода:

isValid = false;
while ~isValid
    % move dots randomly
    [secs, keyCode, deltaSecs] = KbWait('untilTime', 0.01);
    if (keyCode == 'q') || (keyCode == 'w')
        isValid = true;
    end
end
% do stuff
person Burak    schedule 22.02.2020