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


HSPTV!掲示板


未解決 解決 停止 削除要請

2011
0416
いつきループ抜けと同時にラベルジャンプ等14解決


いつき

リンク

2011/4/16(Sat) 19:31:49|NO.38456

こんばんは。
ゲームを作っている中で、
タイトル画面でしばらく待っているとプロローグが始まり、
プロローグ中にボタンを押すと強制的にタイトル画面に戻るという
ゲームでは良くある処理を行おうとしています。
そこで、プロローグの処理自体は終えているので、
後はタイトル画面に戻す処理だけなのですが、
画像アニメーションの関係でrepeatを使っている部分がいくつかあるので、
stick命令を入れて、エンターを押されるとbreakで抜けるという所までは考えました。

ただ、抜けた後はloopの次の処理という事になるので、
その次にgotoを入れたりすると、
ボタンを押さずに通常処理を行った際もジャンプする事になります。
repeat中にbreak以外で脱出するのはダメだと、参考にしている講座でも見ましたし、
何かいい方法がないかと考えているのですが・・・。



この記事に返信する


Cookies

リンク

2011/4/16(Sat) 19:34:38|NO.38457

多分いい方法ではないのでしょうが、僕はいつもそういうときはフラグを一つ用意し、
フラグ判定をifでして、gotoを実行させるようにしてます。



いつき

リンク

2011/4/17(Sun) 00:16:14|NO.38462

回答ありがとうございます。
stick の変数をif条件にしてloop後に配置したら一応成功しましたが、
次にくるrepeatでは同じ条件にしても反応しないという現象が。
これはまた別の問題だとは思いますが・・・。



いつき

リンク

2011/4/17(Sun) 00:35:12|NO.38463

と思ったら、次のrepeatの中にstick命令の記述が抜けてました・・・。
stick命令はifと組み合わせて使用している例が多いですが、
一度stickで使う変数を指定した後はどこかでとぎれるのか、
もう一回指示しないと反応しないんですね・・。
効果範囲が良く分からない・・・。

repeat 10 stick a if a = 32 :break ;エンターで抜け loop repeat 10 if a = 32 :break ;上でエンター押さずにここにきて、エンター押してもif条件は達成できない loop



たんす

リンク

2011/4/17(Sun) 01:05:21|NO.38464

stick命令は、noteselとかのような「変数を指定しておく」ものではなく、
ginfoなどのように「そのときの値を取得する」タイプだと思います。

調べたい瞬間に使うしかないのでは。



いつき

リンク

2011/4/17(Sun) 10:29:52|NO.38471

>>たんすさん
>stick命令は、noteselとかのような「変数を指定しておく」ものではなく、
>ginfoなどのように「そのときの値を取得する」タイプだと思います。
ええ、結果からして何となくそういう事だと思うんですが・・・。
そうなると、繰り返しの場所でないと使えないって事ですかね?
ただ、

repeatの中にstickとif命令

repeat中にボタン入力

次のreepatで条件達成して処理実行

であれば理解は出来るのですが、

ループはせず通常の処理中にstickとif命令

その後処理の間に何個if命令を入れてもボタンを押しても処理はされない

なので、厳密に動作する記述が何故OKか、動作しない記述が何故NGなのかが、
分かっていないので、stickの利用に四苦八苦してます。
講座などで載っているのはいずれもOKの記述であって
こうだとNGというのが見つからず、完全に理解が及んでいません・・・。



Cookies

リンク

2011/4/17(Sun) 10:45:18|NO.38472

そのとおりで、stickやgetkeyはその時点でのキー入力しか受け取ってくれません。
なのでキー入力を待つ場合、普段はrepeatなどのループ内に置くことが多いようです。

通常の動作途中にキー判定をしたい場合、ifの直前にstickやgetkeyを再度するようにせねばなりません。
プロローグ処理にループは使っていないのでしょうか?
使ってたらその初めか終わりにstick&ifを付け加えればできます。

もしくは、onkeyによるキー割り込みという方法もあります。
onkeyをプロローグ処理前に入れておき、その割り込み先ラベルにタイトル処理をすれば大丈夫です。
プロローグ処理後にonkey解除を忘れずに。



SYAM

リンク

2011/4/17(Sun) 11:03:52|NO.38473

>効果範囲が良く分からない・・・。
効果に「範囲」はないものと考えましょう。
お分かりだと思いますが、全ての命令は実行にほんの少しずつ時間がかかります。で、その積み重ねでプログラムの実行に時間がかかるわけです。
stick命令もその時間の中の、ある時刻に実行を開始され、ほんの僅かな時間の後に終了して次の命令に移ります。
stick命令は実行されると、関係するキーの状態を調べて変数に格納します。この調べる瞬間はただの一瞬ですが、それを高速で何度も発生させることによってユーザーに操作の機会を与えるわけです。
なので、例えばstick命令の実行の頻度が低く、stick命令と次のstick命令の間にユーザーがキーを押して放してしまった場合にはキーが押されたことを検出できない場合があるかもしれません。
とはいえ、たとえばユーザーがキーを押してから放すまでの時間が0.1秒以上かかるとしたら、一秒に10回stick命令を実行すれば間違いなく取りこぼしは起きないことになります。
よほどワザとそうしない限りはそんな一瞬だけキーをおしたりすることはないと考えてよいでしょうし、それでも必要なら頻度を上げればいい話ですね。



いつき

リンク

2011/4/17(Sun) 12:43:10|NO.38474

>Cookiesさん
>SYAMさん
お二人ともありがとうございます。
プロローグの中にはアニメーションとしてrepeatを使用している箇所と
ただ、1枚絵を一定区間で出すだけなので単純にwait→gcopyさせている箇所がある為、
仕込み方に困っていましたが、お二人の解説に拠ればやはりrepeatの中で噛ませる方が処理させ易いみたいですね。
なので、1枚絵の部分もrepeatで処理してかませる様にしてみようと思います。
onkeyは確かに一番手っ取り早いんですが、使うキーを指定できないという
ネックがあるみたいなので、別の機会に考えようと思います。

それで、話は変わるというかタイトル画面に飛ばした後の話なんですが、
一定区間待つと又プロローグに移るという事で、
下記の様にしてみたのですが、

*prologue_title   ;プロローグ処理 color 0,0,0 pos 0,0 boxf wait 50 y=300 repeat 150 stick key if key = 32 :break redraw 0 boxf pos 0,y gcopy 1,0,0,300,300   ;タイトル画面の画像呼出(画面外からせりあがってくる) y-2 wait 1 redraw 1 loop     if key = 32 :goto *title_scr 〜以下プロローグ処理の続き stop 〜 *title_scr ;タイトル処理 color 0,0,0 pos 0,0 boxf gcopy 1,0,0,300,300 ;タイトル画面の画像呼出 repeat if op_idou = 100 :break ;cntが100になったらループ抜け op_idou = cnt       wait 10 loop if op_idou = 100 :goto *prologue_title ;抜けた後にプロローグ開始位置にジャンプ
プロローグ中にエンターを押して、タイトル処理に飛ばすのは成功しますが、
その後、cntが100になってループを抜け出し、ジャンプした後、(ジャンプしてると思うんですが)
画像表示と共に、画像がぶれた感じになって閉じれなくなり、強制終了するしかないという
repeat〜loopにwaitを仕込まなかった時のような現象が起きました。
一定時間経つと発生という処理はこれだと不味いでしょうか?
というか、閉じれなくなる現象が何故起こるのかがわからないんですけども・・・。



HK2

リンク

2011/4/17(Sun) 13:56:18|NO.38475

こちらでは再現できませんでした。
今回は省略されている「〜以下プロローグ処理の続き」の箇所に問題があると思います。

また、*title_scrのrepeatに入る前に、op_idou=0を入れてください。
タイトルで一度タイムアウトでプロローグに戻り、もう一度タイトルに入ったときに、
すぐにプロローグに戻ってしまいます。

あと、このソースはどのように入力されましたか?
コピーして実行しようとしても、そのままでは実行できませんでした。
そのまま実行できるようにしていただくとありがたいです。



いつき

リンク

2011/4/17(Sun) 17:39:35|NO.38489

>HK2さん
すいません、上の記述は一部記述が抜けてました。
そして、抜けている記述が問題となる原因でした。

if op_idou = 100 :goto *prologue_title ;抜けた後にプロローグ開始位置にジャンプ
の前にタイトル処理中もボタンを押す事で処理をし直すという事をしたくて
(今思えばこれだけでは記述が足らないのですが)

if key = 32 :goto *title_scr
なんてものを入れていました。
しかし、デバッグを見る限り、プロローグ中にエンターを押した事で
keyに32が入りっぱなしだった為、
*opning_titleと*title_scrの両方の条件を満たしてしまい、
同時処理というか連続ジャンプというかそういった処理が起きてしまい
固まってしまったのだと思います。
この処理が無い状態だと、自然とジャンプして元に戻りました。

>また、*title_scrのrepeatに入る前に、op_idou=0を入れてください。
確かにそうですね。ありがとうございます。

何だか自分のミスが目立って申し訳ありませんでした。
次はタイトル画面での選択(十字キー)処理になりますが、
また何か分からない事がありましたらよろしくお願いします。
一応コピペで動作出来るような記述を書いておきます。
hsp3ttl.jpgはここの初心者講座でも使用している「doclib」の中にある画像です。

screen 0,640,400 buffer 1 picload "hsp3ttl.jpg" gsel 0 *prologue_title ;プロローグ処理 op_idou=0 color 0,0,0 pos 0,0 boxf wait 50 y=400 repeat 200 stick key if key = 32 :break redraw 0 boxf pos 0,y gcopy 1,0,0,640,400 ;タイトル画面の画像呼出(画面外からせりあがってくる) y-2 wait 1 redraw 1 loop if key = 32 :goto *title_scr stop *title_scr ;タイトル処理 color 0,0,0 pos 0,0 boxf gcopy 1,0,0,640,400 ;タイトル画面の画像呼出 repeat if op_idou = 100 :break ;cntが100になったらループ抜け op_idou = cnt wait 10 loop ;if key = 32 :goto *title_scr ;コメント外すと大変な事に。 if op_idou = 100 :goto *prologue_title ;抜けた後にプロローグ開始位置にジャンプ



HK2

リンク

2011/4/17(Sun) 19:07:22|NO.38491

解決されているのでこれで最後にします。

0.keyを確認する前に、必ずstick命令を実行してください。


ここから下は無視してもかまわない(無視した方がいいかもしれない)ことです。
1.いいことがあるかもしれない命令
continue
いいことがあるとは保証しません。

2.コメントをはずすとフリーズする原因(無視した方がよい可能性大)


if key = 32 :goto *title_scr
が実行されるときのop_idouの値は100です。
この状態で*title_scrにジャンプすると、
op_idou=100の状態でrepeatの処理が始まり、
repeat内の一番初めの

if op_idou = 100 :break
が条件を満たしてbreakが実行されます。
breakが実行されると、次に実行されるのはloopの次なので、

if key = 32 :goto *title_scr
です。
もちろん、このときもop_idou=100なので、
また*title_scrに行ってこれの繰り返しです。


ちなみに

if op_idou = 100 :goto *prologue_title
はその上の

if key = 32 :goto *title_scr
で別の場所に行っているので、実行されません。



いつき

リンク

2011/4/17(Sun) 19:21:09|NO.38492

>HK2
なるほど、keyが32を保持しっ放しだったのはstick命令が無かったからなんですね。
固まる原因も誤解していたようです。
解説ありがとうございました。
気づいたらいつのまにか途中からチェックが入ってましたが、これで解決と致します。



limit

リンク

2011/4/17(Sun) 20:14:55|NO.38494

repeat〜loopを使わない処理の仕方もあるよと紹介だけ。
gotoメインのソースは煩雑になりがちなので、
慣れてきたらgosubメインの処理をおすすめします。


screen 0,640,400 buffer 1 picload "hsp3ttl.jpg" gsel 0 mode_labels = *prologue_title, *title_scr #enum MODE_PROLOG = 0 #enum MODE_TITLE mode = MODE_PROLOG *main redraw 0 stick key old_mode = mode gosub mode_labels(mode) if mode!=old_mode:count = 0 ;モード切替、カウント変数初期化 redraw 1 await 16 count++ goto *main *prologue_title ;プロローグ処理 color 0,0,0 boxf if count>50:y+2 pos 0,400-y gcopy 1,0,0,640,400 ;タイトル画面の画像呼出(画面外からせりあがってくる if key = 32 or y>400 { y=0 mode=MODE_TITLE } return *title_scr ;タイトル処理 color 0,0,0 boxf pos 0,0 gcopy 1,0,0,640,400 ;タイトル画面の画像呼出 if count>100:mode = MODE_PROLOG return



いつき

リンク

2011/4/17(Sun) 20:47:13|NO.38496

上がっていたので、見てみたら別のサンプルが。

>limitさん
わざわざありがとうございます。
gosubで処理する事は、頭にはあっても記述が分からなかったので、
サンプルがあって助かります。
ただ、使った事のない命令等が含まれる為、
内容を理解するまではソースを保存しておいて、慣れてきてから使ってみようと思います。



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