Coderで作成した複数物体のプロパティを一括操作できるElementArrayStimのデモプログラムについて、今度はBuilderを使ったデモ。
※2021.08.18 追記:Builderではレンダリングのためにわざわざ「win.flip()」を記述する必要はありません!
そのプログラムの下記10行目〜26行目、
N = 3 #Num of rows=Set size fieldSize = 200 #Field size xys = np.array([[-1*fieldSize,0],[0,0],[fieldSize,0]]) #Element positions elemSize = [50,10,70] #Element sizes cols = np.array([[1,-1,-1],[-1,1,-1],[-1,-1,1]]) #R,G,B masks = 'circle' #Element shapes cs = 'rgb' #RGB color space tget = visual.ElementArrayStim(win, nElements=N, sizes=elemSize, sfs=0, phases=0, xys=xys, colors=cols, colorSpace=cs, elementMask=masks ) tget.draw() #Draw the image. #win.flip() # Not necessary for Builder program! core.wait(2) #Wait 2 seconds.
を、BuilderのCodeコンポーネントへ記載していきます。
Codeコンポーネントは、アプリの右側のメニューに見つけることができます(下図上段真ん中)。
コードの記載先は「Begin Routine」のタブ内で良いでしょう。
先のコードでは、visual.Windowのwinにおける数値の単位が「pix」になっていたので、Builder本体の「Experiment Settings」も変更します。
設定用ウィンドウを開いたら、「Screen」タブ内の「Units」を「pix」へ設定します。
このまま実行すれば、Coderで実行したような結果が得られるはずです。
ただし、被験者情報を入力するウィンドウが表示され、画面表示はフルスクリーンになります。
変更する場合は、上と同様な設定用ウィンドウ上で、フルスクリーンのチェックを外し、適切な縦横サイズを入力して下さい。
今度は、数秒のあいだ刺激を呈示し続け、1フレームごとに見た目を変更してみます。
ここでは、呈示時間は空のTextコンポーネントを3秒間呈示し続けることで時間を測ることとします。
Textコンポーネントは、右側のメニューの「T」のアイコンです。クリックすると、設定用の小ウィンドウが出現します。
ここで、「Stop」(呈示時間)の箇所を「duration(s)」にしておきます(フレーム数などで指定することができます)。
特に表示する文章が無いので、「Text」の箇所は空欄にしておきます。
今度は、Codeコンポーネント内を少しいじります。
「Each Frame」タブで、1フレームごとにElementArrayStimの内容が更新され、これらを描画するようにします。
「Begin Experiment」タブでは、描画を行う最後の3行は消してしまいます。
「Each Frame」タブでは、
tget.xys = np.random.random_sample([N, 2]) * fieldSize - fieldSize / 2.0 # Random element positions tget.size=np.random.random_sample(N) * 100 # Random element sizes tget.colors=np.random.uniform(low=-1,high=1,size=(N,3)) # Random RGB colors tget.draw() # Draw the image. win.flip() # Show the drawn image.
としておきます。
これでプログラムを実行すると、3秒のあいだ、瞬間的にカラフルな円がサイズと位置を変えて書き換わっていく様子が観られると思います。