ウィンドウを開く(関数化)

前項でウィンドウを開くプログラムについて説明しました。基本的にあのやり方で問題は無いのですが、
ここではScreen(‘OpenWindow’, …)関数をより使いやすいものにするための関数を作成してみましょう。

どのような関数を作りたいか
引数の仕様変更
やりたいこととしては、まず引数のrectの仕様を変更することです。
元のScreen(‘OpenWindow’, …)関数では、引数のrectとして
[左上のX 左上のY 右下のX 右下のY]
という形式で値を指定しますが、これはあまり直感的ではありません。
[左上のX 左上のY ウィンドウの横幅 ウィンドウの縦幅]
という形式で指定できた方が良いので、これができるようにします。

冗長な引数の省略
Screen(‘OpenWindow’, …)関数では第二引数でスクリーン番号を指定しますが、たいていの場合はこの値は0で、変更することはありません。ですのでこういった引数は省略してしまいましょう。
加えて、背景色もウィンドウ作成時に決める必要は必ずしも無いので、これも関数の引数から省略します。

比較
元の関数:[window, rect] = Screen(‘OpenWindow’, screenNumber, color, rect)
作る関数:[window, rect] = setupScreen(windowRect, isFullScreen)

新しい関数は、名前をsetupScreen()としました。
引数は以下の2つがあります。
 windowRect:ウィンドウの位置と大きさ。[左上のX 左上のY ウィンドウの横幅 ウィンドウの縦幅]で指定。
 isFullScreen:フルスクリーンにするかどうか。trueを入れた場合、windowRectの値に関係なくフルスクリーンとなる。
関数の返り値は元のScreen(‘OpenWindow’, …)関数と同じです。

コードは以下のようになります。

function openWindowFunctionExample()
	clear all;
    
	% Disable stuck keys
    xxDisableStuckKeys();
    
	% open a window
	[window, rect] = setupScreen([0 0 800 600], false);
	
	% background
	Screen('FillRect', window, [230 230 230]);
	% 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

function [window, rect] = setupScreen(windowRect, isFullScreen)
	if(isFullScreen)
		% fullscreen
		[window, rect] = Screen('OpenWindow', 0, 0);
	else
		% windowed
		windowRect(3) = windowRect(3) + windowRect(1);
		windowRect(4) = windowRect(4) + windowRect(2);
		[window, rect] = Screen('OpenWindow', 0, 0, windowRect);
	end
end

setupScreen関数について
setupScreen関数内では、まずフルスクリーン指定がなされているかどうかで場合分けをしています。
フルスクリーンの場合:引数のwindowRectの値に無関係にフルスクリーンでウィンドウを開きます。
フルスクリーンでない場合:Screen(‘OpenWindow’, …)関数にrectを引数で与えますが、その前にwindowRectの値に変更を加えます。

ラッパー
今回作成したsetupScreen関数はラッパーと呼ばれるものの一種で、Screen(‘OpenWindow’, …)関数のラッパー関数です。
ラッパー関数とは、元ある関数を自分にとって使いやすい形に置き換えた(ラップした)関数のことです。

コメント