2016-06-16 20 views
0

Ich benutze psychtoolbox in MATLAB und ich möchte einen Teilnehmer erhalten, um die Verzerrung einer Reihe von Bildern von 0-9 zu bewerten. Ich habe GetChar versucht, aber wenn ich das Skript ausführe, wartet es nicht darauf, dass der Benutzer eine Antwort gibt, sondern bewegt sich einfach auf den nächsten Bildschirm. Irgendwelche Ratschläge, wie ich das beheben kann?GetChar nicht auf Antwort warten

%using a loop to show images 
for k=1:290 
texture1(k)=Screen('MakeTexture',w,images{k});  
end 
for k=1:145 
Screen('DrawTexture',w, texture1(k), [], leftposition); 
Screen('DrawTexture',w, texture1(k+145), [], rightposition); 
Screen('DrawLines', w, allCoords,... 
lineWidthPix, black, [xCenter yCenter], 2); 
Screen(w,'Flip'); 
pause(0.2); 
end 


%rating text 
DrawFormattedText(w,'Rate distortion 0-9','center','center',[255 255 255]); 
Screen(w,'Flip'); 
GetChar(); 


%press space to finish 
DrawFormattedText(w,'press space to finish','center','center',[255 255 255]); 
Screen(w,'Flip'); 


% Wait for a key press 
KbStrokeWait; 

% Clear the screen 
sca; 

Antwort

0

Es gibt ein paar Dinge, hier geht: Sie sind nur für Tastendrücke suchen nach Ihre Schleife beendet ist, und Sie sind nicht das Ergebnis der Tastendruck speichern.

GetChar ist auch chaotisch (Sie würden wahrscheinlich FlushEvents anrufen möchten, um die Warteschlange zu löschen, oder Sie können laufen in (von help GetChar):

Wenn ein Zeichen vor dem Aufruf GetChar eingegeben wurde dann GetChar wird return sofort, dass Charakter.

eine alternative ist im Beispiel unten gezeigt. Es verwendet KbWait, die sehr ähnliche Funktionalität zur Verfügung stellt, mit einem wenig mehr Arbeit (dh den Tastencode an einem char Umwandeln). Darüber hinaus wird eine Verzögerung von 5 ms zwischen den Schlüsselprüfungen implementiert, wodurch verhindert wird, dass versehentliches Tastenspringen (das Zählen von einzelnen Drücken als Mehrfachdrücken) verhindert wird.

Dieses Beispiel öffnet ein kleines Fenster in der oberen linken Ecke, zeigt die aktuelle Schleifeniteration in der Mitte des Bildschirms an und wartet auf einen einzelnen Tastendruck, um fortzufahren. Es zeichnet auch die Zeiten des Tastendrucks in times auf.

Screen('Preference', 'SkipSyncTests', 2); 
[win, rect] = Screen('OpenWindow', 0, [0 0 0], [15 15 400 400]); 
Screen('TextSize', win, 20); 

answers = cell(1, 5); 
times = zeros(1, 5); 
ref_time = GetSecs; 

for ii = 1:5 
    DrawFormattedText(win, num2str(ii), 'center', 'center', [255 255 255]); 
    Screen(win, 'Flip'); 
    [times(ii), key_code] = KbWait; 
    answers{ii} = KbName(find(key_code)); 
    WaitSecs(0.1); %# Wait an extra 100ms for better debouncing 
end 

times = times - ref_time; 

sca;