上へ

図―地反転図形

 

図―地反転図形の実験のデモンストレーションプログラムFigureGround.exeVisual 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_jbttn_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

 

上へ