|
|
2007/11/10(Sat) 06:24:33|NO.12256
初めまして。
HSP3.1でなかなか作ることができないのですが、教えていただきたいです。
画像(マイピクチャにある決まった写真)を11枚PC上で提示する際に
1 「これから画像を提示します」というメッセージ(メッセージ画面は常に背景は黒)
私がスペースキーを押すと2に画面が変わります。↓
2 「画像の1枚目」これが 10秒提示されます 自動的に10秒経ったら3に
3 「今の画像には何が書いてありましたか」というメッセージ 手元の紙に記載してもらい スペースキーを押すことで4に
4 画像2これを 20秒
5 「この画像について思い出すことを書いてください」というメッセージ スペースキーを押して6へ↓
6 画像3これを 15秒 15秒後自動的に7に
7 「この画像は好きですか」というメッセージ ペースキーで8に
・
・
・
(省略)
・
・
・
22 画像11 これを 13秒 自動的に21に
23 「今の色調は暗かったですか」という質問メッセージ スペースキーを押して22に
24 最後に「お疲れ様でした」というメッセージ スペースキーで一連の流れは終了
というプログラムなのですが,どのように作ったらよいのでしょうか。パワーポイントでならば自分で作ってみたのですが、
このHSP3.1の場合はどのように作ったら良いのかわかりません。
よろしくお願いいたします。
|
|
2007/11/10(Sat) 06:48:13|NO.12257
color、boxf、cls、picload、getkey、wait、mes、goto、gosub、return
とりあえず、これだけあればできるんでね?
それぞれエディタで入力して、文字にカーソル合わせて、f1押せば良いんでね。
|
|
2007/11/10(Sat) 06:58:52|NO.12258
pos
も付けとく?
|
|
2007/11/11(Sun) 15:55:31|NO.12312
どこで苦戦しているのかわかりませんが、
スペースキーの反応 サンプルです。
color 0,0,0 : boxf
repeat
getkey a,32
if a=1 : break
wait 10
loop
color 255,255,255
pos 0,0 : mes "スペースキーが押されました。"
|
|
2007/11/11(Sun) 23:10:38|NO.12326
いや、何をどう苦戦しているか、その説明もなしではアドバイスのしようも無いんでね?
どんなスクリプト書いているか出してくる方が話が早いと思うのだが、どうか。
|
|
2007/11/12(Mon) 09:34:17|NO.12336
cls
mes "これから画像を提示します"
スペースキー入力待ち
picload 画像1枚目
wait
mes "今の画像には何が書いてありましたか"
スペースキー入力待ち
と、上から順番に書いていったら良いかと。
|
|
2007/11/12(Mon) 09:44:17|NO.12337
命令語はF1でHELPを見ながら書く
picloadはファイル名の前にパスを付ける
1行書いては実行し、posやboxfで手直ししていく。
こつこつやっていけば完成すると思います。
|
|
2007/11/12(Mon) 13:32:55|NO.12339
スペースキー入力待ちは、同じ処理なのでgosubで
ぱらぱらと書込みごめんなさい
|
|
2007/11/16(Fri) 08:44:03|NO.12424
2行目のmypictureへのパス。my documets止まりじゃないですか?
3行目の )
エラーのメッセージを読み、何行目でエラーが出るのか。
順番にエラーを潰していってください。
|
|
2007/11/16(Fri) 09:00:07|NO.12425
最初に、
>picload mypic+"Water lilies.jpg"
>picload mypic+"Sunset.jpg"
>picload mypic+"Blue hills.jpg"
>picload mypic+"Blue hills.jpg"
>picload mypic+"Winter.jpg"
こんなファイル俺らは無いんだから、そのまんま書くな。
line命令とか変わりにmesで文字を入れるとかして、コピーしたら即動作させられるようにしてくれ。
動作確認するのに態々俺らは同じファイル名の画像を用意せにゃならんのか?
それとも態々動作するように改造しなきゃならんのか?
>具体的には画像が提示されませんし、実行できない状況です。
こう言うのはもっと具体的に書け。
#Error:SJIS space code error in line 33 [hsptmp]
のエラーなら
>PICBUF_NO5=5 ;とりあえず5枚ですが、このあと同様に6枚追加します。
の5と;の間に全角文字の空白が入っている。
まんま書いてあるんだから、エラーメッセージくらい読め。
次に
>PICBUF_NO1=1 )
の)は何を意図しているのか知らないが、このままではエラーだ。
以上を直せば意図した通りかどうかはしらないが、動作する事は確認した。
まー、とりあえず「配列変数」についても調べてみると、すっきりするんでね?
|
|
2007/11/16(Fri) 15:44:52|NO.12429
同じような仕事は50セットも作らず、50回repeatすればいいのです。
|
|
2007/11/17(Sat) 01:28:30|NO.12458
dimとエディタで打って、それにカーソル合わせてF1押してみれば良いんでね?
その辺が気になるなら一言付け加えるが、
いちいち一枚づつbuffer作って画像を読み込む必要は無い。
一つ作ったら使い回しができる。
gselとエディタで打って、それにカーソル合わせてF1押してみれば良いんでね。
つか、そもそもclsかboxfで画面を消してしまえば、bufferに読まなくても
スクリーンID0に直接picloadできるけどな。
|
|
2007/11/17(Sat) 10:07:34|NO.12464
fさんのおっしゃるとおりで、1枚ずつアナログ的にコピーして貼り付けて、画像ナンバーだけを訂正…と
いう作業を50回繰り返すのはどうかなーと思うようになりました。ちょっとアナログ過ぎますよね。
NO.1の画像には、Aというメッセージ、No.22の画像にはCというメッセージ…という感じで50枚
流れていくようにしたいのです。
50枚の画像に、5種類くらいのメッセージを割り当てて対応させて、それぞれの画像の時間を指
定できるようにしたいです。
しかし、今できる自分の技術でやるしかないかなーとも思っています。なかなか難しいです。
さて、
PICSIZ1_X=ginfo(12)
PICSIZ1_Y=ginfo(13)
の件は、まだよくわかってないのですが、1から50まで作らず、PICSIZ1のまま50個同じで良い
という理解でよろしいでしょうか。
|
|
2007/11/17(Sat) 13:18:55|NO.12466
TAKAMURAさんが現在組まれているように、画像をすべてロードしてから
gzoomで次々とコピーしていく手順ですと、変数 PICSIZ は1〜50まで必要になります。
時間がないのであればとりあえずは、”1枚ずつアナログ的にコピーして貼り付けて、画像ナンバーだけを訂正…と
いう作業を50回繰り返す”ということでも問題はないと思いますよ。
しかし、今の書き方だとプログラムの長さもあって見にくい部分が大きいので、
PICFILE1 = "image1.bmp"
PICFILE2 = "image2.bmp"
PICFILE3 = "image3.bmp"
PICBUF_NO1 = 1
PICBUF_NO2 = 2
PICBUF_NO3 = 3
buffer PICBUF_NO1
picload PICFILE1,,,0
PICSIZ1_X = ginfo(12)
PICSIZ1_Y = ginfo(13)
(以下略)
というようにまとめて書くことをおすすめします。
|
|
2007/11/17(Sat) 13:23:33|NO.12467
>PICSIZ1_X=ginfo(12)
>LPICSIZ1_Y=ginfo(13)
>
>の件は、まだよくわかってないのですが、1から50まで作らず、PICSIZ1のまま50個同じで良い
>という理解でよろしいでしょうか。
buffer1〜buffer50に画像を読み込んでおくのなら
buffer1の場合
gsel 1
を実行すればginfo(12)はbuffer1の横幅 = buffer1に読み込まれている画像の横幅です。
しかし、その都度ginfo(12)を使うのではなく、予め変数にセットしておき、それを使うのなら
50個の変数が必要です。しかし、50個の配列にする方が賢いでしょう。
配列については、docs/hspprog.htmの「2.スクリプト記述の基本」の「配列変数」参照。
なお、ginfo(12),ginfo(13)よりginfo_winx,ginfo_winyを使うことをお勧めします。
(common\hspdef.asで「ginfo」を検索してください)
|
|
2007/11/17(Sat) 14:33:48|NO.12470
>PICBUF_NO2=2
>buffer PICBUF_NO2,,,0
>picload mypic+"Sunset.jpg"
>PICSIZ2_X=ginfo(12)
>PICSIZ2_Y=ginfo(13)
>await 0
初期化部分で
num=50
sdim picname,64,num
picname(0)="hogehoge1.jpg","Sunset.jpg","hogehoge3.jpg",<以下略>
picname(10)=""hogehoge11.jpg","hogehoge12.jpg",<以下略>
<以下略>
としておけば
repeat num
buffer cnt+1
picload mypic+picname(cnt)
await 0
loop
で50個処理できるはずです(試してないので、イマイチ自信がない)。
>wsiz_x=PICSIZ2_X :wsiz_y=PICSIZ2_Y
>gosub *setsaiz
>pos SCRSIZ_X/2-wsiz_x/2,SCRSIZ_Y/2-wsiz_y/2
>gzoom wsiz_x,wsiz_y,PICBUF_NO2,0,0,PICSIZ2_X,PICSIZ2_Y,1
>btim=3*1000
>gosub *breaktim
>
>pos (SCRSIZ_X/2-strlen(mesdat3)*TITLFSIZ/4),(SCRSIZ_Y/2-TITLFSIZ/2)
>mes mesdat3
>btim=0
>gosub *breaktim
repeat num
gsel cnt+1
PICSIZE_X=ginfo_winx: PICSIZE_Y=ginfo_winy
gsel 0
wsiz_x=PICSIZE_X :wsiz_y=PICSIZE_Y
gosub *setsaiz
pos SCRSIZ_X/2-wsiz_x/2,SCRSIZ_Y/2-wsiz_y/2
gzoom wsiz_x,wsiz_y,cnt+1,0,0,PICSIZE_X,PICSIZE_Y,1
btim=3*1000
gosub *breaktim
pos (SCRSIZ_X/2-strlen(mesdat3)*TITLFSIZ/4),(SCRSIZ_Y/2-TITLFSIZ/2)
mes mesdat3
btim=0
gosub *breaktim
loop
| |
|
2007/11/17(Sat) 15:06:27|NO.12473
>必要な1275.jpg,1463.jpg,2071.jpgをマイドキュメントのマイピクチャに保存してあるこれら>の画像の表示を実行するため
>にはどうしたらよいのでしょうか。
誤:mypic= dirinfo(0x10000+5)+"\\"
正:mypic= dirinfo(0x10000+5)+"\\My Pictures\\"
うーん、今回も試してないので自信がない(^_^;;
|
|
2007/11/17(Sat) 18:19:16|NO.12475
#module
#deffunc set str p1, str p2, int p3, str p4, int p5, int p6, int p7
x = 0 : y = 0
if p1!"" {
path = p4 + p1
buffer p7
picload path
w = ginfo( 12 )
h = ginfo( 13 )
x = ( ginfo( 20 ) - w ) / 2
y = ( ginfo( 21 ) - h ) / 2
}
gsel 0
redraw 0
if p1!"" {
pos x, y
gmode 0, w, h
gcopy p7, 0, 0
}
if p2!"" {
color 204, 204, 204
pos p5, p6
mes p2
}
redraw 1
await p3
color 0, 0, 0
boxf
return
#global
onexit goto *onEnd
mypic = dirinfo( 0x10005 ) + "\\My Pictures\\"
SPC = 16
ESC = 128
ct = 0
amount = 5
len = 260
sdim pict, len, amount
sdim msg, len, amount
dim wt, amount
pict.0 = ""
pict.1 = "1.jpg"
pict.2 = "2.jpg"
pict.3 = "3.jpg"
pict.4 = ""
msg.0 = "スタート"
msg.1 = ""
msg.2 = ""
msg.3 = ""
msg.4 = "終了"
wt.0 = 2000
wt.1 = 1000
wt.2 = 3000
wt.3 = 1000
wt.4 = 1000
w = ginfo( 20 )
h = ginfo( 21 )
bgscr 0, w, h, 0, 0, 0, w, h
boxf
*main
stick key
if key & SPC : gosub *onKeyPressed
if key & ESC : goto *onEnd
await 10
goto *main
*onKeyPressed
if ct<amount : set pict.ct, msg.ct, wt.ct, mypic, 100, 200, 2
ct++
return
*onEnd
sdim pict, 0, amount
sdim msg, 0, amount
end
作ってみました。
参考にしてください。
| |
|
2007/11/18(Sun) 03:41:53|NO.12479
マイピクチャー取得↓
#define CSIDL_MYPICTURES 0x0027
mes dirinfo(0x10000|CSIDL_MYPICTURES)
|
|
2007/11/19(Mon) 23:21:16|NO.12508
【修正前】
buffer PICBUF_NO1
picload PICFILE1,,,0
【修正後】
buffer PICBUF_NO1
dialog "PICFILE1="+PICFILE1
picload PICFILE1,,,0
|
|
2007/11/20(Tue) 08:15:53|NO.12510
最初にデジカメ画像を使うという話でした。いつからか.bmpになっていますが
それで間違いはないのですね?ファイル名を含めてもう一度ご確認を!
|
|
2007/11/20(Tue) 08:43:17|NO.12511
最終か。自力で作れるのは良い事だ。
じゃあ用意しといたコレを張っておくので、今後の参考にしてくれ。
exist "program.txt"
buffersize = strsize
if buffersize = -1 {
dialog "手順ファイルがありません。",0
end
}
//---------------------------------------------
bgscr 1 , ginfo(20) , ginfo(21)
buffer 2 , 640 , 480 : gsel 1 , 2
SCRSIZ_X = ginfo(12) : SCRSIZ_Y = ginfo(13) : TITLFSIZ=35
font "MS ゴシック" , TITLFSIZ , 1 + 16
sdim program , buffersize
notesel program : noteload "program.txt"
EOF = 0
//---------------------------------------------
//mouse -1
while EOF = 0
gosub *execution
await 100
wend
//mouse
end
//---------------------------------------------
*execution
gosub *gettext
if linedata = "\\picload" {
gosub *gettext
gsel 2 : picload linedata
PICSIZ_X = ginfo(12) : PICSIZ_Y = ginfo(13)
gsel 1
WORK_X = int( ( double( SCRSIZ_X ) / PICSIZ_X ) * PICSIZ_X )
WORK_Y = int( ( double( SCRSIZ_Y ) / PICSIZ_Y ) * PICSIZ_Y )
gzoom WORK_X , WORK_Y , 2,0,0, PICSIZ_X,PICSIZ_Y,1
}
if linedata = "\\wait" {
gosub *gettext : time = int( linedata )
wait time
}
if linedata = "\\mes" {
gosub *gettext
gsel 1
color : boxf : color 255,255,255
pos (SCRSIZ_X / 2 - strlen( linedata ) * TITLFSIZ / 4 ) , ( SCRSIZ_Y / 2 - TITLFSIZ / 2 )
mes linedata
}
if linedata = "\\pouse" {
stick s
while s = 0
stick s
await 10
wend
}
if linedata = "\\end" : EOF = 1
if noteinfo( 1 ) = 0 : EOF = 1
return
//---------------------------------------------
*gettext
noteget linedata , 0 : notedel 0
return
同じ場所に「program.txt」のファイル名でコレを保存してくれ。
\picload
test.jpg
\wait
500
\mes
これで良い?
\pouse
\end
見たら使い方は分かるだろ。多分。
| |
|
2007/11/20(Tue) 08:55:45|NO.12512
一言書き忘れたが、\picloadの所のファイル名はそっちで適当に変更してくれよ。
なんか書いとか無いと、何してるかわからんぽいので適当なファイル名入れたからな。
|
|
2007/11/20(Tue) 18:47:48|NO.12518
あなたのスクリプトを拝見しました。
現在のパソコン事情からすれば大丈夫とは思いますが、画面より大きい画像を
50 枚もストックするのはうまい方法とは思えません。
以下のスクリプトを試してみて下さい。
ファイル名を変更すれば実行できます。これを叩き台にすれば良いかと。
#module
//
// 初期化
// set を利用する為の下準備
//
#deffunc init
SCRSIZ_X = ginfo( 20 ) // 画面の幅
SCRSIZ_Y = ginfo( 21 ) // 画面の高さ
MY_PIC = dirinfo( 0x10005 ) + "\\My Pictures\\"
TITLFSIZ = 35
STR_Y = ( SCRSIZ_Y - TITLFSIZ ) / 2 // 表示する文字列の高さ
return
//
// 1回のテストでの動作内容
// ( 一定時間画像を描画した後、文字列を表示して
// キー入力があるまで待機する )
//
// p1 表示する画像ファイル名
// p2 表示する文字列
// p3 画像を表示しておく時間
//
#deffunc set str p1, str p2, int p3
color 0, 0, 0
boxf
await 1000
if p1!"" {
buffer 2
path = MY_PIC + p1
picload path
w = ginfo( 12 ) // 画像の幅
h = ginfo( 13 ) // 画像の高さ
if w<=SCRSIZ_X & h<=SCRSIZ_Y { // 画像が画面内に収まる場合
x = ( SCRSIZ_X - w ) / 2
y = ( SCRSIZ_Y - h ) / 2
rw = w : rh = h
}
else { // 画像が画面内に収まらない場合
ratio_x = double( SCRSIZ_X ) / double( w )
ratio_y = double( SCRSIZ_Y ) / double( h )
if ratio_x>ratio_y {
ratio = ratio_y
}
else : ratio = ratio_x
rw = int( ratio * w )
rh = int( ratio * h )
x = ( SCRSIZ_X - rw ) / 2
y = ( SCRSIZ_Y - rh ) / 2
}
gsel 0
pos x, y
gzoom rw, rh, 2, 0, 0, w, h, 1
await p3
color 0, 0, 0
boxf
}
if p2!"" {
x = SCRSIZ_X / 2 - strlen( p2 ) * TITLFSIZ / 4
y = STR_Y
if p1!"" : await 1000
font "MS ゴシック", TITLFSIZ, 1+16
color 204, 204, 204
pos x, y
mes p2
}
return
#global
init // モジュールの初期化
onexit goto *onEnd
SPC = 16
ESC = 128
ct = 0
len = 128
amount = 4
datcnt = 6
sdim pict, len, amount
sdim msg, len, amount
dim wt, amount
sdim dat, len, datcnt
;mmload "C:\\Program Files\\Messenger\\pikabu.wav", 0, 0
dat.0 = "それでは始めます"
dat.1 = "この画像は好き?"
dat.2 = "この画像で思い出す名詞は?"
dat.3 = "この画像は見たことがありますか?"
dat.4 = "この画像はきれい?"
dat.5 = "実験終了ですお疲れ様でした"
//
// ファイル名を変更して下さい
//
pict.0 = "0.jpg"
pict.1 = "1.jpg"
pict.2 = "2.jpg"
pict.3 = "" // 使用しない場合
msg.0 = dat.2
msg.1 = dat.3
msg.2 = dat.1
msg.3 = dat.5
wt.0 = 1000 * 2
wt.1 = 1000 * 3
wt.2 = 1000 * 2
wt.3 = 0
bgscr 0, ginfo( 20 ), ginfo( 21 ), 0, 0, 0, ginfo( 20 ), ginfo( 21 )
boxf
mouse -1
//
// 1度だけ実行
//
set "", dat.0, 0
await 1000
;mmplay 0
await 3000
color 0, 0, 0
boxf
set "", dat.1, 0
//
// メインループ
//
*main
stick key
if key & SPC : gosub *onKeyPressed
if key & ESC : goto *onEnd
await 10
goto *main
*onKeyPressed
if ct<amount {
set pict.ct, msg.ct, wt.ct
}
else : goto *onEnd
ct++
return
*onEnd
sdim pict, 0, amount
sdim msg, 0, amount
sdim dat, 0, datcnt
end
| |
|
2007/11/22(Thu) 13:47:22|NO.12553
TAKAMURAさんのスクリプトをそのままループにしました。
このほうがご自分が作られたものだから分かりやすいかなと。
sdim picfile,64,50
sdim mesdat,128,50
//---------------------------------------------------------dataを打ち込んでください
PICFILE(0) = "156_01_b.jpg"
PICFILE(1) = "156_06_b.jpg"
PICFILE(2) = "156_08_b.jpg"
time(0)=2,3,2
mesdat(0)="この画像は好き?"
mesdat(1)="この画像で思い出す名詞は?"
mesdat(2)="この画像は見たことがありますか?"
mesdat(3)="この画像はきれい?"
mesdat(49)="実験終了ですお疲れ様でした"
//----------------------------------------------------------ここまで
mypic = dirinfo( 0x10005 ) + "\\My Pictures\\"
mmload "C:\\Program Files\\Messenger\\pikabu.wav",0,0
bgscr 0,ginfo(20),ginfo(21),0,0,0
gsel 0,2
mouse -1
color :boxf :color 255,255,255
SCRSIZ_X=ginfo(12)
SCRSIZ_Y=ginfo(13)
TITLFSIZ=35
font "MS ゴシック",TITLFSIZ,1+16
color 0:boxf:color 255,255,255
pos (SCRSIZ_X/2-strlen(mesdat(0))*TITLFSIZ/4),(SCRSIZ_Y/2-TITLFSIZ/2)
mes mesdat(0)
btim=0:gosub *breaktim
await 1000
mmplay 0
await 3000
//------------------------------------------------------main repet回数を書き込んでください
repeat 3
buffer 1
picload mypic+PICFILE(cnt)
PICSIZ1_X = ginfo(12):wsiz_x=PICSIZ1_X
PICSIZ1_Y = ginfo(13):wsiz_y=PICSIZ1_Y
await 0
gosub *setsaiz
gsel 0
pos SCRSIZ_X/2-wsiz_x/2,SCRSIZ_Y/2-wsiz_y/2
gzoom wsiz_x,wsiz_y,1,0,0,PICSIZ1_X,PICSIZ1_Y,1
btim=time(cnt)*1000 //-----cntとtimeを整合させてください
gosub *breaktim
pos (SCRSIZ_X/2-strlen(mesdat(cnt))*TITLFSIZ/4),(SCRSIZ_Y/2-TITLFSIZ/2)//-cntの部分チェック
mes mesdat(cnt) //------画像とmesを整合させてください
btim=0
gosub *breaktim
loop
end
*setsaiz
//試していません
return
*breaktim
//試していません
return
| |
|
2007/11/25(Sun) 18:53:36|NO.12595
これまでアドバイスを下さった皆様へ
皆様本当にありがとうございました。
修士論文の心理学実験のためのプログラムということで,あと
残り1ヶ月の間に実験を行い、データを整理して考察しなくては
ならず、私一人でかなり焦っておりました。
皆様から教わったことをもとに自分なりにアレンジを加えて、
頑張りたいと思います。
また、これを機にHSPについても興味を持ちましたので、自力で
スクリプトを作成できるように少しずつ学んでいくつもりです。
本当にご意見やアドバイスありがとうございました。
|
|