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


HSPTV!掲示板


未解決 解決 停止 削除要請

2007
1110
TAKAMURA写真提示プログラム25解決


TAKAMURA

リンク

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の場合はどのように作ったら良いのかわかりません。

よろしくお願いいたします。



この記事に返信する


f

リンク

2007/11/10(Sat) 06:48:13|NO.12257

color、boxf、cls、picload、getkey、wait、mes、goto、gosub、return

とりあえず、これだけあればできるんでね?
それぞれエディタで入力して、文字にカーソル合わせて、f1押せば良いんでね。



f

リンク

2007/11/10(Sat) 06:58:52|NO.12258

pos

も付けとく?



ToK

リンク

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 "スペースキーが押されました。"



f

リンク

2007/11/11(Sun) 23:10:38|NO.12326

いや、何をどう苦戦しているか、その説明もなしではアドバイスのしようも無いんでね?

どんなスクリプト書いているか出してくる方が話が早いと思うのだが、どうか。



mm

リンク

2007/11/12(Mon) 09:34:17|NO.12336

cls
mes "これから画像を提示します"
スペースキー入力待ち
picload 画像1枚目
wait
mes "今の画像には何が書いてありましたか"
スペースキー入力待ち

と、上から順番に書いていったら良いかと。



mm

リンク

2007/11/12(Mon) 09:44:17|NO.12337

命令語はF1でHELPを見ながら書く
picloadはファイル名の前にパスを付ける
1行書いては実行し、posやboxfで手直ししていく。

こつこつやっていけば完成すると思います。



mm

リンク

2007/11/12(Mon) 13:32:55|NO.12339

スペースキー入力待ちは、同じ処理なのでgosubで

ぱらぱらと書込みごめんなさい



mm

リンク

2007/11/16(Fri) 08:44:03|NO.12424

2行目のmypictureへのパス。my documets止まりじゃないですか?
3行目の )

エラーのメッセージを読み、何行目でエラーが出るのか。
順番にエラーを潰していってください。



f

リンク

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 )

の)は何を意図しているのか知らないが、このままではエラーだ。

以上を直せば意図した通りかどうかはしらないが、動作する事は確認した。



まー、とりあえず「配列変数」についても調べてみると、すっきりするんでね?



mm

リンク

2007/11/16(Fri) 15:44:52|NO.12429

同じような仕事は50セットも作らず、50回repeatすればいいのです。



f

リンク

2007/11/17(Sat) 01:28:30|NO.12458

dimとエディタで打って、それにカーソル合わせてF1押してみれば良いんでね?


その辺が気になるなら一言付け加えるが、
いちいち一枚づつbuffer作って画像を読み込む必要は無い。
一つ作ったら使い回しができる。

gselとエディタで打って、それにカーソル合わせてF1押してみれば良いんでね。

つか、そもそもclsかboxfで画面を消してしまえば、bufferに読まなくても
スクリーンID0に直接picloadできるけどな。



TAKAMURA

リンク

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個同じで良い
という理解でよろしいでしょうか。



Elfizm

リンク

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) (以下略)

というようにまとめて書くことをおすすめします。



ANTARES

リンク

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」を検索してください)



ANTARES

リンク

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



ANTARES

リンク

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\\"

うーん、今回も試してないので自信がない(^_^;;



xxx

リンク

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

作ってみました。
参考にしてください。



pizza

リンク

2007/11/18(Sun) 03:41:53|NO.12479

マイピクチャー取得↓


#define CSIDL_MYPICTURES 0x0027 mes dirinfo(0x10000|CSIDL_MYPICTURES)



ANTARES

リンク

2007/11/19(Mon) 23:21:16|NO.12508

【修正前】
buffer PICBUF_NO1
picload PICFILE1,,,0
【修正後】
buffer PICBUF_NO1
dialog "PICFILE1="+PICFILE1
picload PICFILE1,,,0



mm

リンク

2007/11/20(Tue) 08:15:53|NO.12510

最初にデジカメ画像を使うという話でした。いつからか.bmpになっていますが
それで間違いはないのですね?ファイル名を含めてもう一度ご確認を!



f

リンク

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

見たら使い方は分かるだろ。多分。



f

リンク

2007/11/20(Tue) 08:55:45|NO.12512

一言書き忘れたが、\picloadの所のファイル名はそっちで適当に変更してくれよ。
なんか書いとか無いと、何してるかわからんぽいので適当なファイル名入れたからな。



xxx

リンク

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



mm

リンク

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



TAKAMURA

リンク

2007/11/25(Sun) 18:53:36|NO.12595

これまでアドバイスを下さった皆様へ

 皆様本当にありがとうございました。
 
 修士論文の心理学実験のためのプログラムということで,あと
残り1ヶ月の間に実験を行い、データを整理して考察しなくては
ならず、私一人でかなり焦っておりました。

 皆様から教わったことをもとに自分なりにアレンジを加えて、
頑張りたいと思います。
また、これを機にHSPについても興味を持ちましたので、自力で
スクリプトを作成できるように少しずつ学んでいくつもりです。

本当にご意見やアドバイスありがとうございました。



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