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


HSPTV!掲示板


未解決 解決 停止 削除要請

2018
0312
へびstickの押しっぱなし?について&またはスクリプトの問題2解決


へび

リンク

2018/3/12(Mon) 03:23:19|NO.82722

始めまして。
HSPを始めたばかりの者です。

最近、自分なりにRPGやアドベンチャーゲームのメニューの様な物を作ったのですが、
そこでの「stick」の使い方に疑問があり質問させていただきます。



;起動直後の設定 meseno=0;メニュー画面番号 sel=0;選択中の番号 max=3;各メニュー画面の最大選択数 *menucore title "Menu test" if bgm=0:mmstop redraw 0 color 0,0,0 boxf gosub *message redraw await 1 goto *menucore *message gosub *move if meseno=0:{ pos 30,0:color 255,255,255:font msgothic,20,1 mes "メニュー1" mes"" mes"次のメニュー";ここでenterを押すと mes"フラッシュ" mes"おわり" } if meseno=1:{ pos 30,0:color 0,255,255:font msgothic,20,1 mes "メニュー" mes"" mes"おわり";続いてこちらも実行されてしまう mes"もどる" } mes sel mes "↑↓キーで移動、enterキーで決定" return *move stick key if key&2 : sel-- : if sel=-1 : sel=max-1;上 if key&8 : sel++ : if sel=max : sel=0;下 if key&32 { ;エンターを押す color 0,255,0 if meseno=0{ if sel=0:cls 4:wait 1:meseno=1:max=2:sel=0 if sel=1:cls 1:wait 1 if sel=2:end } if meseno=1{ if sel=0:cls 4:end if sel=1:cls 1:wait 1:meseno=0:max=3:sel=0 } } color 255,255,255 :pos 10,sel*20+40: mes ">>    <<" return
作ってたプログラムから単体で動くように抜き出したので不自然な点もあるとは思いますがご容赦ください。
このスクリプトの中で、キー操作をstickで制御しています。
stick命令は押した瞬間だけを感知すると思ったのでメニューに最適だと思って使用したのですが、
このプログラム上だと、メニュー1の「次のメニュー」を押すと、キー入力が止まらないのか、
次のメニューの同じsel番号(=end)を実行してしまいます。(end命令自体は分かりやすくするための意図的な事です)

希望はメニュー画面で一旦止まる事なので自分なりに色々考えてスクリプトを弄ってみましたが、続けて実行されてしまうのに変わりありませんでした。
仮の対処方法(2番目のメニューではスペースキーに変えるなど)も考えましたが、
もっとスマートな方法があるのかもしれないとも思っています。

stickの正しい(良い)使い方、問題点など指摘して頂ければと思います。



この記事に返信する


あまら

リンク

2018/3/12(Mon) 06:04:31|NO.82723

stick自体は問題ありません。

全体的に始めたばかりとは思えないほど綺麗に組めていると思います。

メインループ内の最初にtitleがあるのは気になりますが……、
titleはループの前か、タイトルを変えるときだけにした方が軽くなるはずです。


問題はEnterを押したときの処理ですね。
押しっぱなしというわけではなく、偶然(?)一度で両方の条件を満たしてしまっただけです。

if key&32 { ;エンターを押す color 0,255,0 if meseno=0{ if sel=0:cls 4:wait 1:meseno=1:max=2:sel=0 // ここでmeseno=1とsel=0にしているため if sel=1:cls 1:wait 1 if sel=2:end } if meseno=1{ if sel=0:cls 4:end // ここの条件に一致してしまって、結果即時endになる if sel=1:cls 1:wait 1:meseno=0:max=3:sel=0 } }
コメントを見てもらえるとわかると思いますが、
直前に変数の内容が次のメニューの終了条件に一致する形になってしまったために
終了してしまうということです。



修正方法はelse:を入れるだけです。

*move stick key if key&2 : sel = (sel-1+max)\max;上 // 剰余(余り)を使う方法もある if key&8 : sel = (sel+1)\max;下 // こちらの方がわかりやすい? if key&32 { ;エンターを押す color 0,255,0 if meseno=0{ if sel=0:meseno=1:max=2:sel=0 if sel=1:cls 1:wait 1 if sel=2:end } else:if meseno=1{ if sel=0:end if sel=1:meseno=0:max=3:sel=0 } } color 255,255,255 :pos 10,sel*20+40: mes ">>    <<" return
waitは不要で、clsは演出かもしれないとは思いましたが画面がチラつくので削除しました。
フラッシュのところだけは確実に演出なので両方残しました。

上下キーを押したときの処理はおまけです。
こんな方法もあるという程度で参考にしてください。



へび

リンク

2018/3/13(Tue) 13:19:43|NO.82740

あまらさん、ありがとうございます。
条件に付いてよく考えていなかったので、つまずいてしまったようです。
あまらさんの教えてくれた方法で解決することが出来ました。
ありがとうございました。



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