読者です 読者をやめる 読者になる 読者になる

心理学実験プログラムの構造

Processing 3 刺激提示

心理学実験用のプログラムをProcessing 3で作る際の構造について

 Processingは,draw()内の記述をずっとループするというのが特徴である。心理学実験では,「注視点→刺激」という風に刺激を1回出して,次の画面に切り替えて,という流れが多い。刺激提示時間の制御も必要となる。Processingではずっとループが続くため,プログラムの構造を工夫しないと,同じ刺激をずっと描画し続けてしまう。

 そこで,if関数によって実験を提示画面に細分化していく。つまり,注視点提示画面,刺激提示画面,などという風にいくつかの画面を作成し,それの順番に切り替えるように構造化する。以下のようなコードで実装する。このコードは,注視点(200ms)→文字(1000ms)を提示するというサンプルである。やや複雑な構造に見えるが,より本格的には注視点描画用の関数を新たに作成するなどで構造自体はよりすっきりさせられる。各ポイントについては以下で説明する。

注視点の描画

 注視点は,line関数で縦線と横線を1回ずつ描画して,十字を描いている。stroke(x,y,z)で線の色,strokeWeight(x)で線の太さを指定している。line(x1,y1,x2,y2)は,(x1, y1)から(x2, y2)に線を引く関数である。

画面の切替

 currentDisplayの値を切り替えることで現在の画面を指定している。各画面は1回刺激を描画したら,その画面がstimTimeの時間分,続くようになっている。特定の条件(今回は時間経過)が来たら,currentDisplayの値をnextDisplayで設定した値で代入し,次の画面に切り替えている。切替の際には,前の刺激を消したいので,rect関数によって,背景と同じ色で塗りつぶしている。

時間取得

 millis()によって,現在の時間を取得できる。startTime = millis()で開始時間を取得した後で刺激を描画し,その後は,drawループで経過時間をpassedTime = millis() - startTimeによって取得し続ける。passedTimeが指定した提示時間であるstimTimeを超えたら,currentDisplay = nextDisplayとし,画面を切り替えている。

コード

String testText;
PFont font;
boolean textDraw = true;
int cenX, cenY,startTime,passedTime,stimTime,
currentDisplay,nextDisplay; 

void setup ()
{
  size(500,500); //windowの大きさ
  background(255,255,255); //背景色を指定
  font = createFont("Yu Gothic",48,true); //フォントを指定
  textFont(font); 
  pixelDensity(2); //retinaに対応
  cenX = width/2; //windowの中心のX座標
  cenY = height/2; //windowの中心のY座標
}

void draw()
{
  if (currentDisplay == 0)
  {
     if (textDraw) //テキスト描画スイッチ
     {
        startTime = millis(); //開始時間を計測
        
        stroke(0,0,0); //線の色を指定
        strokeWeight(1); //線の太さを指定
        line(cenX,cenY+20,cenX,cenY-20); //線を引く(注視点の縦線)
        line(cenX+20,cenY,cenX-20,cenY); //線を引く(注視点の縦線)
        noStroke(); //枠線なし
        textDraw = false; //描画スイッチOFF
        
        stimTime = 4000; //提示時間を指定
        nextDisplay = 1; //次の画面を設定
     } 
  }
  
  else if (currentDisplay == 1)
  {
     if (textDraw) //テキスト描画スイッチ
    {
        startTime = millis(); //開始時間を計測
        
        fill(0,0,0); //塗りの色を指定
        textSize(48); //テキストサイズを指定
        textAlign(CENTER,CENTER); //テキストを真ん中揃え
        testText = "にほんご"; //テキスト内容を指定
        text(testText, cenX,cenY); //テキストを描画
        textDraw = false; //描画スイッチOFF
        
        stimTime = 4000; //提示時間を指定
        nextDisplay = 2; //次の画面を設定
    }
  }
     
  else if (currentDisplay == 2)
  {
    exit(); //終了処理
  }
  
  passedTime = millis()-startTime; //途中経過を計測
   
  if (passedTime >= stimTime) //提示時間を超えたら
  {
    currentDisplay = nextDisplay ; //画面を切り替える
    fill(255,255,255); //全画面を塗りつぶし
    rect(0,0,width,height);
    textDraw = true; //テキストの描画スイッチON
  }
  
}

Processing 3.2.3(Mac)で作成