解説2

ここでは、PTBで刺激を描画するときに、だいたいいつも行う約束事について説明します。

try

「2.6.4 1つの円」でも書いたように、PTBを使って何かを画面に描画するときにはtry・・・catch・・・endの構造を使ったほうがよいようです。tryからcatchの間で何かしらのエラーが生じたときに、必ず実行してほしいことをcatchからendの間に書きます。具体的には次の5行を実行します。

ShowCursor;

Screen('CloseAll'); %or sca

ListenChar(0);

Screen('Preference', 'VisualDebuglevel', olddebuglevel);

psychrethrow(psychlasterror);

KbName('UnifyKeyNames');

「2.6.2 キーボード入力」の補足を参照してください。

KbCheck;

コメントに書いてある通り、ここでのKbCheckはキー入力をチェックしているわけではなく、プログラム上で初めてKbCheckを呼び出すときには読み込みに時間がかかるので、時間がかかっても支障がないプログラムの先頭部分でとりあえず1度読み込んでおく、という意味合いしかないようです。

KbCheck以外にも、同様に読み込みに時間がかかるコマンドがあるらしいのですが、具体的には書いてありませんね。。。

ListenChar(2);

「2.6.4 1つの円」にListenCharについての説明を書いています。

olddebuglevel=Screen('Preference', 'VisualDebuglevel', 3);

私もよく分かっていないのですが、コメントを直訳すると、実験を始めるたびに(訳注:コマンドウィンドウ上に)たくさんのメッセージが出るのを防ぐために、デバッグレベルを高めに設定します。

screens=Screen('Screens');
screenNumber=max(screens);
[expWin,rect]=Screen('OpenWindow',screenNumber);

この3行はPTBで実験を始めるときにはお約束の表記です。screenNumberは複数のディスプレイを使う実験でなければ注意を払う必要はありません。刺激を呈示するスクリーンはフルスクリーンになります。ブレークポイントを使ったデバッグをするときには、「2.6.5 ブレークポイント2」で説明した通りウィンドウサイズを指定する必要があります。コメントにもテストのために小さいウィンドウで表示するときには

[expWin,rect]=Screen('OpenWindow',screenNumber,[],[10 20 1200 700]);

としなさい、と書いてありますね。ただし、フルスクリーンモードでないといろいろな不具合が出ることがあるので、実験をするときには必ずフルスクリーンモードにします。

help SyncTrouble

も見てください。

[mx, my] = RectCenter(rect);

rectはScreen('OpenWindow',screenNumber)で返ってくる値のひとつで、スクリーンを表す四角形です。その四角形の中心の座標が、mx, myに代入されます。

HideCursor;

カーソルを消します。実験中は消しておいたほうがよいかと思いますが、デバッグ時にはコメントアウトしてカーソルを表示させておいたほうがよいでしょう。

Screen('TextSize', expWin, 24);

現在のスクリーンのテキスト(文字)のサイズを24ピクセルに指定しています。

myText

実験の開始時に画面に表示したい文字列を代入しています。「\n」はそこで改行することを意味しています。代入されている内容は日本語では次のようになります。「この実験では、2本の水平線分の相対的な長さについて判断してもらいます。2本の線分の長さが同じだと思ったら"s"のキーを、異なると思ったら"d"のキーを押してください。本試行の前に3試行の練習試行があります。練習を始めるにはいずれかのキーを押してください」

DrawFormattedText(expWin, myText, 'center', 'center');

ウィンドウにmyTextの内容を描画します。文字列は画面中央に自動的に配置されます。ただし、ここではまだ画面上に文字列は見えないことに注意してください(イメージとしては、画面上に見えないところでプログラムは文字列を画用紙に書き込んでいるのです。そしてScreen('Flip')を呼び出したときに、その画用紙をバンッと画面上に呈示するのです)。

ちなみに、Screen('DrawText')を使っても同じことができるとコメント部分に書かれています。デモプログラムのDrawFormattedTextDemoも参考にしてみてください。

Screen('Flip', expWin);

ここでDrawFormattedTextで描画した内容が画面上に表示されます。Screen('Flip')を参照してください。

KbWait([], 3);

KbWaitを参照してください。

解説2はここまで