HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2008
1210
BAY物体の移動時間の設定など7未解決


BAY

リンク

2008/12/10(Wed) 13:25:32|NO.21460

はじめまして。現在大学4年で心理学を専攻している学生です。
卒論で行う実験の作成に教授からHSPを勧められ、1ヶ月前くらいから取りくんでいるん
ですが、わからない点がいろいろと出てきたので、お手数ですがご教授いただけると非常
に助かりますm(__)m

下のスクリプトのような実験を行おうとしているのですが、

(1)現状右から左へ動く○の移動時間は目分量でだいたい1800msくらいにしている状態なの
ですが、スクリプトの上で1800msの移動時間に設定するにはどのように書けばいいのでしょ
うか?

(2)現状1ブロック終了毎に被験者の5試行目の反応の評価だけを表示している状態ですが、
5試行目終了後に1~5試行の評価を一つの画面ですべて表示するにはどのようにすればい
いのでしょうか?
        
                  1 素晴らしい!(100ms以内)
       このように      2 なかなかです(200ms以内)
       したいのですが→   3 がんばりましょう(400ms以内)
                  4 素晴らしい!(100ms以内)
                  5 全然タイミングが違います(400ms範囲外)


※本番の実験では左端の四角い枠内はずっと黒いままで行い、実際にどのタイミングで
 ○が左端に来るのか被験者はわからない状態にするのですが、現在は作成途中という
 ことで左端に○が到達して、見えるようになってしまっています。


スクリプトは以下になります。拙い点が多々あると思いますがよろしくお願いします。

pre
#uselib "kernel32"
#func QueryPFreq "QueryPerformanceFrequency" var
#func QueryPCount "QueryPerformanceCounter" var

dim lgint, 4 ;LARGE_INTEGER構造体
#define _start QueryPFreq nFreq : QueryPCount nBefore
#define _goal QueryPCount lgint(2) : dwTime=strf("%%.3fmSec", 1000.*(lgint(2)-nBefore)/nFreq)

a=0
screen 0, ginfo (20), ginfo (21)
color : boxf
font msmincho, 30:pos 100,150:color 255,255,255
mes"・この実験では右から左へ移動する●が、"
pos 100,180:mes" 左端の四角い枠内の位置にくると思われるタイミングを予測して"
pos 100,210:mes" ストップボタンを押していただきます。"
pos 100,300:mes"・実験は5試行を1ブロックとし、計20ブロック行います。"
pos 100,390:mes"・準備ができたら下の実験開始ボタンを押して、"
pos 100,420:mes" 実験を開始してください。"
pos 500,550:button "実験開始",*hata0
stop

*hata0
b=0
screen 0, ginfo (20), ginfo (21)
color : boxf
color 255, 255, 255
boxf 65, 300, 950, 350
color 0,0,0
boxf 500, 306, 944, 344
color
boxf 69, 306, 109, 344
pos 500, 470 :button "ストップ" ,*hata1
while ( b < 5 )
await 2000
b = b + 1
kaisu = 140 ;繰り返し回数
x1 = 60 ;開始位置
x2 = 900 ;終了位置
y = 306 ;Y座標
dx = (x2 - x1) / kaisu ;移動量
_start
repeat kaisu
redraw 0
color :boxf
color 255, 255, 255
boxf 65, 300, 950, 350
color 0,0,0
boxf 500, 306, 944, 344
color
boxf 69, 306, 109, 344
color 255, 255, 255
mes "●" : font msmincho, 37
pos x2 - dx * cnt, y ;座標指定(x,y)
await 1
redraw 1
loop
stop

*hata1
_goal
title dwTime
notesel data
noteadd dwTime
notesave "hsp-test0"
wend
if 100 >= int(dwTime)-1800&int(dwTime)-1800>= 0|0 >int(dwTime)-1800&int(dwTime)-1800>=-100{
screen 0, ginfo (20), ginfo (21)
color : boxf:color 255, 255, 255:font msmincho, 37:pos 100,300
mes "素晴らしい!(100ms以内)"
}else :if 200>=int(dwTime)-1800&int(dwTime)-1800>100|-100>int(dwTime)-1800&int(dwTime)-1800>=-200{
screen 0, ginfo (20), ginfo (21)
color : boxf:color 255, 255, 255:font msmincho, 37:pos 100,300
mes "なかなかです(200ms以内)"
}else :if 300>=int(dwTime)-1800&int(dwTime)-1800>200|-200>int(dwTime)-1800&int(dwTime)-1800>=-300{
screen 0, ginfo (20), ginfo (21)
color : boxf:color 255, 255, 255:font msmincho, 37:pos 100,300
mes "普通です(300ms以内)"
}else :if 400>=int(dwTime)-1800&int(dwTime)-1800>300|-300>int(dwTime)-1800&int(dwTime)-1800>=-400{
screen 0, ginfo (20), ginfo (21)
color : boxf:color 255, 255, 255:font msmincho, 37:pos 100,300
mes "がんばりましょう(400ms以内)"
}else :if int(dwTime)-1800>400|-400>int(dwTime)-1800{
screen 0, ginfo (20), ginfo (21)
color : boxf:color 255, 255, 255:font msmincho, 37:pos 100,300
mes "全然タイミングが違います(400ms範囲外)"}
await 3000
goto *hata2

*hata2
a=a+1
await 3000
if a<3{goto *hata0}
color:boxf:color 255, 255, 255:pos 300,300 :font msmincho, 37:mes "実験は以上で終了です。"
pos 300,335 :mes "ありがとうございました。"
stop
/pre



この記事に返信する


ASD

リンク

2008/12/10(Wed) 14:08:41|NO.21462

①せめて動くスクリプトを貼ってください
②インデントを付けないと見難くてしようがない
③fps管理をするならタイマーを駆使する



BAY

リンク

2008/12/10(Wed) 14:47:24|NO.21464

ASDさん返信ありがとうございます。

①、②について
すみません、インデントを付けようとしてスクリプトの最初と最後に
pre、/preを付けたのですが、うまくいかなかったみたいです。
pre、/preを除けば動くと思います。

③について
「タイマーを駆使」ですか。もうちょいいろいろいじってみます。



ASD

リンク

2008/12/10(Wed) 15:06:24|NO.21465

preと/preを除いてコピペしても動きません。

タイマー云々
 1800msで端から端まで、ということで
 その間のフレーム数を確定させる。
 60fps、30fpsとか好きなfpsを決めて1フレーム当たりの
 消費時間を設定して、SetTimer、WM_TIMERで画面を更新すると
 正確に端から端まで1800msに調整できる。

 コマ落ちが無い、とすればだけど。



SYAM

リンク

2008/12/10(Wed) 15:25:14|NO.21466

あれ
うごきましたよ私…?
※WindowsXP



SYAM

リンク

2008/12/10(Wed) 15:45:15|NO.21467

速度×時間=距離
ていうのは非常によく出てくる話ですね。
で、いまやりたいことに当てはめると
1コマ当りの移動距離×画面の更新回数=全体の移動距離
…です。画面の更新が時間的に等間隔であれば、その回数で時間を表せますね。
1秒あたりの画面の更新回数が安定していれば、画面の更新回数は移動にかける時間によって決まります。
全体の移動距離は決まってますから、
あとは1コマ当りの移動距離は簡単な1次方程式で導けますね。
画面の更新回数を安定させるには、100ms程度の精度ならawait命令を使って問題ないと思います。手軽ですしね。

質問(2)については、配列を使いましょう。
毎回の記録先を配列の各要素に代入すれば、各回のデータを後で自由に取り出せます。
研究などでデータ収集するなら、配列を使う機会はたくさんあると思いますので、まだ習得されていないなら習得を強くオススメします。



BAY

リンク

2008/12/10(Wed) 23:33:04|NO.21480

・ASDさん返信ありがとうございます。

”60fps、30fpsとか好きなfpsを決めて1フレーム当たりの
 消費時間を設定して、SetTimer、WM_TIMERで画面を更新すると
 正確に端から端まで1800msに調整できる。”

 このアドバイスを参考に作ってみます。

・SYAMさん返信ありがとうございます。

丁寧にアドバイスありがとうございます。(2)については「配列」を使えばいいんですね。
やってみます。



暇人

リンク

2008/12/11(Thu) 08:13:47|NO.21488

FireFoxからだと "&int" の部分が "∫" に変換されてるので動作しないようです。
IE,Operaだと問題はないです。



ONION software Copyright 1997-2025(c) All rights reserved.