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


HSPTV!掲示板


未解決 解決 停止 削除要請

2010
0726
アイルー一時停止・再生ボタンについて7解決


アイルー

リンク

2010/7/26(Mon) 03:28:46|NO.33964

別件でお世話になっております。

現在スライド表示において、再生・一時停止・停止のボタン処理を作成致しております。

過去ログの
ttp://hsp.tv/play/pforum.php?mode=all&num=31888
あたりも参考にさせていただいておりますが、flgをうまく使いこなすことができず、
一時停止はstopにおいて止めることができましたが、再生ボタン(return)でうまく処理を返すことができません。

#include "hspcv.as" #include "llmod3\\llmod3.hsp" #include "llmod3\\misc.hsp" /* スライドショーを表示 */ *slide // プログラムの終了処理 onexit gosub *exit buffer 7 : picload "image.bmp" // ボタン画像(1枚の画像に3枚のボタン画像が入ってます) screen 3, 800, 650 // ウィンドウID3を作成 // ディレクトリ一覧を作成 dirlist imgFileDir, "image\\*.bmp", 0 // 変数をメモリノートパッド命令のバッファに設定 notesel imgFileDir repeat gosub *slide_play loop /* スライドショーの画像表示 */ *slide_play repeat notemax //行数分繰り返す noteget tmpImg, cnt // 画像読込 cvload "image\\" + tmpImg, 0 // 画像情報取得 cvgetinfo imgSizeX, 0, CVOBJ_INFO_SIZEX cvgetinfo imgSizeY, 0, CVOBJ_INFO_SIZEY // 画面サイズ windowSizeX = 800 windowSizeY = 600 // 画像と画面の比率 ratioX = double(windowSizeX) / imgSizeX ratioY = double(windowSizeY) / imgSizeY // アスペクト比を固定で、画像をバイキュービック法でリサイズ if ratioX > ratioY { cvresize ratioY * imgSizeX, windowSizeY, 0, CV_INTER_CUBIC } else { cvresize windowSizeX, ratioX * imgSizeY, 0, CV_INTER_CUBIC } // 再生ボタン // stat1=再生、stat2=一時停止、stat3=停止 repeat 3 objsize 64, 64 pos 570 + cnt*75, 570 button "", *slide_select btnimg cnt, 7, cnt*64, 0, 64, 64 loop //フェードイン用画面 buffer 1, 800, 650 cvgetimg 0, 0 // 画像を表示 //フェードイン処理 color 255 gsel 3 repeat 257 redraw 0 color : boxf gmode 3, , , cnt pos 0, 0 : gcopy 1, 0, 0, 800, 650 wait 1 redraw 1 loop wait 300 // 表示間隔を設定 //フェードアウト用画面 buffer 1, 800, 650 gcopy 3, 0, 0, 800, 650 //フェードアウト処理 gsel 3 repeat 257 redraw 0 color : boxf pos 0, 0 gmode 3, , , 256-cnt gcopy 1, 0, 0, 800, 650 wait 1 redraw 1 loop loop return /* スライドショーの再開処理 */ *slide_start return /* スライドショーの一時停止処理 */ *slide_pause stop /* ボタン押下時の処理 */ *slide_select if stat = 0 : flg == 0 : gosub *slide_start if stat = 1 : flg == 1 : gosub *slide_pause if stat = 2 : goto *top *top gsel 0 mes "停止しました" stop /* プログラムの終了処理 */ *exit // ウィンドウIDが0以外はウィンドウを非表示 if ginfo_act = 0 { end } else { gsel wparam, -1 }

ボタン押下時、*slide_selectに遷移した時点で、それぞれのstatは取得できているので、
あとはflgの設定をしなければならないのかとは思うのですが…

やりたいことは、スライド再生時、一時停止ボタン(*slide_pause)押下で一時停止を行い、
再生ボタン(*slide_start)押下時にスライド再生を再開することです。

どうぞよろしくお願い致します。



この記事に返信する


MillkeyWeler

リンク

2010/7/26(Mon) 07:29:09|NO.33965

スクリプト 55行目の、button 命令で、goto ジャンプしようとしてませんか?
実行中に、特定の場所から、ジャンプし、元の場所に戻りたい場合は、「button gosub "test", *slide_select」
でサブルーチンジャンプしてください。

また、

*slide_select if stat = 0 : flg == 0 : gosub *slide_start if stat = 1 : flg == 1 : gosub *slide_pause if stat = 2 : goto *top

の、「if stat =1 : flg == 1 : gosub *slide_pause」で *slide_pause にサブルーチンジャンプしてると思いますが、その先に処理を戻すための return
命令がありません。「*slide_start で return してるじゃんかー」とお思いでしょう。
ですが、*slide_start で行った return 命令の戻り先は、前回の *slide_pause の return であり、*slide_select から元の場所へ戻るための return 命令ではないのです。

gosub と return は、セットであり、gosub 命令を行ったら、return 命令で元の場所に戻る作業が必要です。



MillkeyWeler

リンク

2010/7/26(Mon) 07:56:03|NO.33966

連続失礼します。

少々スクリプトを作ってみましたので、参考にしていただければ、幸いです。

screen 0,300,200,0 : cls 4 pos 200,0 : button gosub "Play",*slide_select pos 200,50: button gosub "Pause",*slide_select pos 200,100: button gosub "stop",*slide_select title "再生しています。" *main ;↓テスト用 redraw 0 color 0 boxf 0,0,300,15 color 255,255,255 pos 0,0 mes "main : "+al+" : flg "+flg redraw 1 al+ ;↑テスト用 wait 1 goto *main *slide_start return *slide_pause title "一時停止しています。" repeat ;↓テスト用; redraw 0 color 0 boxf 0,15,300,30 color 255,255,255 pos 0,15 : mes "pause: "+cnt+" : flg "+flg redraw 1 ;↑テスト用; if flg=0 : break ; slide_select の flg が 2 の時に、ループを抜け出す。 wait 1 loop return *slide_select if (stat = 0)&(flg=0) : title "再生しています。" : return ; ↓ flg が 0 の時(初期又は再生中)に、Pause ボタンが押された場合、flg を 1 にし、無限リピートさせる if (stat = 1)&(flg=0) : flg=1 : gosub *slide_pause : return ; ↓ flg が 1 の時(一時停止中)に、Play ボタンが押された場合、flg を 0 にして、無限リピートを抜け出す。 if (stat = 0)&(flg=1) : flg=0 : gosub *slide_pause : title "再生しています。" : return if (stat = 2) : goto *top ;サブルーチンジャンプしないので戻れなくなる。 return *top color 0 : boxf color 255,255,255 pos 0,0 : mes "停止されました。" title "停止されました。" stop

詳しい説明などは、実行してみてもらえばわかると思いますので、省略させていただきます。



ANTARES

リンク

2010/7/26(Mon) 08:30:40|NO.33968

 misc.hspにバグがあって動きませんが、そこは直しているものと仮定します。

【誤】 button "", *slide_select 【正】 button gosub "", *slide_select 【誤】(2個所) wait 1 redraw 1 loop 【正】(2個所) wait 1 if flg==2: break gosub *l_flg redraw 1 loop if flg==2: break 【誤】 loop return 【正】 loop goto *top *l_flg if flg==0: return repeat wait 20 if flg==0: break loop return 【誤】 if stat = 0 : flg == 0 : gosub *slide_start if stat = 1 : flg == 1 : gosub *slide_pause if stat = 2 : goto *top 【正】 flg=stat if flg>2: dialog "エラーがあります stat="+flg: end return




アイルー

リンク

2010/7/26(Mon) 22:18:37|NO.34010

MillkeyWeler 様

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


> スクリプト 55行目の、button 命令で、goto ジャンプしようとしてませんか?
> 実行中に、特定の場所から、ジャンプし、元の場所に戻りたい場合は、
> 「button gosub "test", *slide_select」でサブルーチンジャンプしてください。

仰る通りでして、55行目のbutton命令でgotoジャンプをし、その後*slide_selectでサブルーチンジャンプをすればいいと
思っておりました。
ボタン押下時に処理を行い、その場所に戻ってくる場合は、ボタンからサブルーチンジャンプをしなければいけないということですよね。

*slide_select
if stat = 0 : flg == 0 : gosub *slide_start if stat = 1 : flg == 1 : gosub *slide_pause if stat = 2 : goto *top

> の、「if stat =1 : flg == 1 : gosub *slide_pause」で *slide_pause にサブルーチンジャンプしてると思いますが、その先に処理を戻すための return
> 命令がありません。「*slide_start で return してるじゃんかー」とお思いでしょう。
> ですが、*slide_start で行った return 命令の戻り先は、前回の *slide_pause の return であり、*slide_select から元の場所へ戻るための return 命令ではないのです。
> gosub と return は、セットであり、gosub 命令を行ったら、return 命令で元の場所に戻る作業が必要です。

これは本当に仰る通りでございます。
gosub と return が、セットでなければ動作しないというのは、HSPのヘルプ等で存じてはおりましたが、
gosubでジャンプした後、複数の処理を経ても、最終的にreturnで戻ってくれると思い違いをしておりました。
gosubを行ったところに、returnで戻り、そこから再度処理をしなければならなかったのですね。

NO.33966で作ってくださりましたソースも、実際に動かさせていただきました。
ボタン押下時の処理がしっかりと書かれていて、gosub と return の流れの勉強になりました。
ソースの作りが自分の書いていたものに沿って書いてくださったため、とてもわかりやすかったです。

無事解決することができました。
ありがとうございました。



アイルー

リンク

2010/7/26(Mon) 22:24:34|NO.34011

ANTARES 様

ご返信ありがとうございました。

> misc.hspにバグがあって動きませんが、そこは直しているものと仮定します。

misc.hspについては、ヘルプにあった通りに修正してあります。

元のソース内に、しっかりと flg を立て、必要なところで loop から break で抜ければ、
わざわざたくさんの分岐用の label を作らなくても、処理が行えるのですね。
自分のソース内には、loop内での flg による動作が全く書かれていなかったということですね。
loopからlabelに遷移してflgを立てても、実際のloop内にflgによる処理を書かなければ、全く意味がありませんでした。

正誤によるわかりやすいご説明ありがとうございました。


MillkeyWeler様とANTARES様のお陰で、臨んだ結果を得ることができました。
ありがとうございました。



ANTARES

リンク

2010/7/27(Tue) 04:06:19|NO.34019

 訂正します。
ポーズ時に停止ボタンを押した場合の考慮が欠けていました。

【誤】 if flg==0: break 【正】 if flg!=1: break



アイルー

リンク

2010/7/27(Tue) 20:25:36|NO.34042

ANTARES 様

修正してくださってありがとうございました!



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