図―地反転図形
図―地反転図形の実験のデモンストレーションプログラムFigureGround.exeをVisual C++で作成した。プログラムファイル名FigureGround.exeをクリックしてダウンロードすれば、ダブルクリックなどによって実行することができる。ただし、.NET Framework3.5対応である。ソースプログラムなどをまとめたものは圧縮ファイルFigureGround.zipとして用意した。ダウンロードしたファイルのファイル名FigureGround.zipをマウスの右ボタンでクリックして表示されるメニュから「解凍」あるいは「展開」を選ぶと解凍することができる。解凍したファイルは、Visual C++2008などで開くことができる。
プログラムを実行すると図1のフォームが表示される。
図1
実験は「OK」ボタンのクリックで始まる。「OK」ボタンのクリックで図2のようになる。
図2
中央の扇形の組み合わされた円において、黒の部分が図になっている間はJキーを押し続け、白の部分が図になっているときはFキーを押し続ける。2分が経過すると、図3のようなフォームになる。
図3
時間軸を横方向にとって、黒が地に見えたとき(Jキーが押されているとき)を黒の線分で、白が地になっているとき(Fキーが押されているとき)を白の線分で表わしている。JキーもFキーも押されていないときは、黒の線分の位置と白の線分の位置の間に黄色の線分で表わされる。
プログラムでは、押されているキーのチェックをタイマーコントロールの時間間隔を
this->timer1->Interval = 500;
と設定して、0.5秒間隔で行っている。タイマーイベントに対して
private: System::Void timer1_Tick(System::Object^ sender, System::EventArgs^ e) {
if (nData
< MaxN){
data[nData++]
= resp;
・・・
と、respに設定された状態を配列dataに保存している。MaxNはソースファイルcommon.cppに
const int MaxN = 240; // 2*60*2
と定義しているが、この変数はヘッダーファイルcommonn.hにおける宣言
extern const int MaxN;
によって読み込まれる。
キーの状態を表わす変数bttn_jとbttn_f、および変数respの値は、ヘッダーファイルcommon.hにおいて
enum bttn_state { on, off };
enum choice { black, white, non };
と宣言されている。これらの値によって、キー押しイベントおよびキーの解放イベントに対応するイベントハンドラの処理が
private: System::Void
Form1_KeyDown(System::Object^
sender, System::Windows::Forms::KeyEventArgs^ e) {
if
(bttn){
switch(e->KeyData){
case Keys::J
: bttn_j = on; resp = black; break;
case
Keys::F : bttn_f = on; resp = white; break;
default: break;
}
}
}
private: System::Void
Form1_KeyUp(System::Object^ sender,
System::Windows::Forms::KeyEventArgs^
e) {
if (bttn){
switch(e->KeyData){
case
Keys::J : bttn_j = off;
if (bttn_f == on) resp = white;
else resp = non;
break;
case
Keys::F : bttn_f = off;
if (bttn_j == on) resp = black;
else resp = non;
break;
default: break;
}
}
}
と行われている。これらのイベントハンドラの用意の仕方については<岡本安晴「大学生のための心理学VC++プログラミング入門」勁草書房>p. 235などを参照されたい。特に、キー押しイベントについては、p. 252で説明している。
2分間の実験が終了すると配列dataの値が
for (int i = 0; i < MaxN; i++){
switch
(data[i]){
case black : g->DrawLine(pnBk,
int(10.0 + i * size), y0 + 5, int(10.0 + (i+1) * size), y0 + 5);
break;
case white : g->DrawLine(pnWt,
int(10.0 + i *size) , y0 - 5, int(10.0 + (i+1) * size), y0 - 5);
break;
default : g->DrawLine(pnYw,
int(10.0 + i *size) , y0, int(10.0 + (i+1) * size), y0);
}
}
と描画される。
参考文献: 大山 正(編著)「実験心理学」サイエンス社、2007.