ウィンドウを開く

画面に何かを描画するためには、まず描画用のウィンドウを開く必要があります。
このサンプルでは、ウィンドウを開き、灰色の背景に緑色の長方形を描画します。
何かキーが押されるとウィンドウが閉じ、プログラムは終了します。

function openWindowExample()
	clear all;
    
	% Disable stuck keys
    xxDisableStuckKeys();
    
	% Open a window
	[window, rect] = Screen('OpenWindow', 0, 0, [0 0 800 600]);
	% [window, rect] = Screen('OpenWindow', 0); % fullscreen window
	
	% background
	Screen('FillRect', window, [220 220 220]);
	% draw a rectangle
	Screen('FillRect', window, [100 255 100], [250 200 550 400]);
	% flip screen
	Screen('Flip', window);
	% wait for keyboard press
	KbWait;
    
	% close the window
	Screen('CloseAll');
end

解説

xxDisableStuckKeys()
これはスタックキー問題を回避するための関数です。
プログラムの先頭には常に入れておくようにしましょう。

[window, rect] = Screen(‘OpenWindow’, 0, 0, [0 0 800 600])
Screen(‘OpenWindow’, …)はウィンドウを開くための関数です。
引数はScreen(‘OpenWindow’, スクリーン番号, 背景色, ウィンドウのrect)です。
 スクリーン番号:どのスクリーンにウィンドウを出すか。メインスクリーンの番号は0。別のモニタに出す場合は1以上の数値を指定する。
 背景色:ウィンドウの背景色。0(黒)から255(白)の値、あるいはカラー([R G B])で指定。
 ウィンドウのrect(※):開きたいウィンドウの位置と大きさを指定する。省略した場合、フルスクリーンになる。
返り値はウィンドウ番号とウィンドウのrect(※)です。
 ウィンドウ番号:開いたウィンドウに対して割り当てられるID番号です。
  (複数のウィンドウを開く場合にはそれぞれのウィンドウに対し異なるウィンドウ番号が付与されます)
 ウィンドウのrect:開かれたウィンドウのrectです。

(※) rect

ここで言うrectとは、ウィンドウの矩形を定義する配列のことです。
引数の場合のrectは[左上のX 左上のY 右下のX 右下のY]で与えます。
一方で、返り値のrectは[左上のX 左上のY ウィンドウの横幅 ウィンドウの縦幅]という値が返されます。
配列の3, 4番目の値が異なっていることに注意。

Screen(‘OpenWindow’, …)関数のrect引数について

Screen(‘OpenWindow’, …)関数の第三引数のrectは[左上のX 左上のY 右下のX 右下のY]という形式で与えます。

ただ、これは幾分面倒な指定方法です。
というのも、例えば左上の座標が(50 50)で横幅と高さが(450 300)のウィンドウを作りたい場合、

[50 50 500 350]

という値を代入する必要があります。ですが、このような場合には

[50 50 450 300]

と指定できた方が直感的ですし、右下の座標値を計算する必要も無く簡単です。
このような場合にはそういう関数を自分で作れば良いでしょう。次項でその例を説明します。

Screen(‘FillRect’, window, [220 220 220])
Screen(‘FillRect’, window, [100 255 100], [250 200 550 400])
Screen(‘FillRect’, …)関数は長方形を描画するための関数です。
引数にウィンドウ番号、色、rectを与えます。
詳しくは後述します。

Screen(‘Flip’, window)
Screen(‘Flip’, …)関数は、描画内容をウィンドウに反映させます。
第二引数にウィンドウidを指定します。
上記のScreen(‘FillRect’, …)関数の時点では、長方形の描画は指示されていますが実際にウィンドウへの描画はまだ行なわれていません。
Screen(‘Flip’, …)関数を使った時点で、それらの指示に従ってウィンドウ内に実際に長方形が描画されます。
実際、この関数を削除してプログラムを実行すると、画面には何も描画されないことが確認できます。

KbWait
KbWait関数が記述された行でプログラムは進行を停止し、ユーザーの入力を待ちます。
キーボードのいずれかのキーが押されるとプログラムの進行が再開され、後続の行に処理が移行します。

Screen(‘CloseAll’)
Screen(‘CloseAll’)関数により現在開いているウィンドウを閉じます。

コメント