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


HSPTV!掲示板


未解決 解決 停止 削除要請

2021
0708
味噌汁にあんこ何故か無視されるメッセージ表示5解決


味噌汁にあんこ

リンク

2021/7/8(Thu) 17:15:37|NO.93184

こんにちは。
HSP 3.5.1を使って次のようなプログラムを作成してみました。

1. 「Enterキーを押すと次に進みます」と画面に表示、Enter押したら2に進む。
2. メッセージ表示「黒太がやって来た!」、Enter押したら3に進む。
3. 画面に黒い円が表示され、Bキー押したら2に戻る
4. 2-3の流れが10回繰り返されたら「終わり」と表示、ここでstopする。


#const fontsize 60 // フォントサイズ設定 #const TRIAL_ALL 10 #const SESSION_ALL 1 screen 1, ginfo_dispx, ginfo_dispy // フルスクリーンウィンドウ #define shiji1 "Enterキーを押すと次に進みます" font msGothic, fontsize // 指示を表示 pos ginfo_dispx/2-(strlen(shiji1)*(fontsize/2))/2, ginfo_dispy/2-fontsize/2 mes shiji1 repeat getkey Enter, 13 if Enter = 1 : break wait 1 loop cls 0 repeat TRIAL_ALL order = cnt cls 0 #define shiji2 "黒太がやって来た!" font msGothic, fontsize // 指示を表示 pos ginfo_dispx/2-(strlen(shiji2)*(fontsize/2))/2, ginfo_dispy/2-fontsize/2 mes shiji2 repeat // Enterキーを押すと進行 getkey Enter, 13 if Enter = 1 : break wait 1 loop repeat SESSION_ALL cls 0 repeat getkey B, 66 circle ginfo_dispx/2-100, ginfo_dispy/2-100, ginfo_dispx/2+100, ginfo_dispy/2+100 if B = 1 { break } wait 1 loop wait 1 loop wait 1 loop cls 0 #define shiji3 "終わり" font msGothic, fontsize // 指示を表示 pos ginfo_dispx/2-(strlen(shiji3)*(fontsize/2))/2, ginfo_dispy/2-fontsize/2 mes shiji3 stop

ところが動かしてみると、ループの1回目だけ「黒太がやって来た!」の
メッセージが表示されずに1から3へ飛んでしまいます。
2回目以降は想定通りにメッセージ→黒円となるのですが、、
色々試してはみたのですが、残念ながら解決に至らず質問させていただきました。
ご助言よろしくお願いいたします。



この記事に返信する


沢渡

リンク

2021/7/8(Thu) 18:24:27|NO.93185

getkeyは「キーが押されている状態かどうか」の判定のみを行うので、
1の場面でEnterを押すと、押したまま2の判定が始まり、
始まったその瞬間に「押されている」と判断されて3に飛んでしまいます。
getkeyではなくてstickを使ったら解決すると思います。
(Bキーはstickには対応していないので、getkeyのままで仕方がありませんが)



UT-X

リンク

2021/7/8(Thu) 18:43:53|NO.93186

getkeyのみでstickと同じような判定を行う方法として、
変数を2つ用意し、一方の変数にgetkeyを行い、その結果がもう一方の変数と
一致しない場合にのみ押されたというフラグを建てる、というものがあります。
押された・離された瞬間だけもう一方の変数を上書きすることで、
押された・離された瞬間以外は変数が一致した状態になり、
長押ししても1回しか反応しないようにできます。
;サンプル
ent=0 eent=0 *chk getkey ent,13 if eent!ent{ eent=ent if ent=1{ ;Enterキーが押された時の挙動 mes "Enterキーが押された" } } await 10 goto *chk



沢渡

リンク

2021/7/8(Thu) 19:10:37|NO.93189

UT-Xさんの言うようにBキーに対しても「押しっぱなし」対策をするのなら、
このような感じになるでしょうか。

#const fontsize 60 // フォントサイズ設定 #const TRIAL_ALL 10 #const SESSION_ALL 1 screen 1, ginfo_dispx, ginfo_dispy // フルスクリーンウィンドウ #define shiji1 "Enterキーを押すと次に進みます" font msGothic, fontsize // 指示を表示 pos ginfo_dispx/2-(strlen(shiji1)*(fontsize/2))/2, ginfo_dispy/2-fontsize/2 mes shiji1 repeat stick key if key&32 : break wait 1 loop cls 0 repeat TRIAL_ALL order = cnt cls 0 #define shiji2 "黒太がやって来た!" font msGothic, fontsize // 指示を表示 pos ginfo_dispx/2-(strlen(shiji2)*(fontsize/2))/2, ginfo_dispy/2-fontsize/2 mes shiji2 repeat // Enterキーを押すと進行 stick key if key&32 : break wait 1 loop repeat SESSION_ALL cls 0 circle ginfo_dispx/2-100, ginfo_dispy/2-100, ginfo_dispx/2+100, ginfo_dispy/2+100 getkey B0,66 //この時点でBキーを押している状態の場合、B0は1になる。 repeat getkey B, 66 if B0 { B0=B //Bキーを一旦離すまでB0は0にならない } else { if B : break } wait 1 loop wait 1 loop wait 1 loop cls 0 #define shiji3 "終わり" font msGothic, fontsize // 指示を表示 pos ginfo_dispx/2-(strlen(shiji3)*(fontsize/2))/2, ginfo_dispy/2-fontsize/2 mes shiji3 stop



とあるプログラマ

リンク

2021/7/8(Thu) 20:20:55|NO.93190

モジュールにしてみました。
getkeyを使っているので、WaitKeyInputの引数もgetkeyと同じキーコードです。

onkeyとかWM_KEYDOWNを使ったほうがスマートではありますが、簡単さと手軽さでrepeat使っています。


// ============================================================= #module #deffunc WaitKeyInput int code, \ local reset, local press press = 0 reset = 0 // キーが上がったらこのリセットフラグを立てる。リセットフラグが立つまでは入力されていても返らない = 長押しを無視 repeat getkey press, code if (reset == 0 && press == 0) : reset = 1 if (reset == 1 && press == 1) : break wait 1 loop return #global // ============================================================= #const fontsize 60 // フォントサイズ設定 #const TRIAL_ALL 10 #const SESSION_ALL 1 screen 1, ginfo_dispx, ginfo_dispy // フルスクリーンウィンドウ #define shiji1 "Enterキーを押すと次に進みます" font msGothic, fontsize // 指示を表示 pos ginfo_dispx/2-(strlen(shiji1)*(fontsize/2))/2, ginfo_dispy/2-fontsize/2 mes shiji1 /* repeat getkey Enter, 13 if Enter = 1 : break wait 1 loop */ // Enter (13) が入力されるまで待機します WaitKeyInput 13 cls 0 repeat TRIAL_ALL order = cnt cls 0 #define shiji2 "黒太がやって来た!" font msGothic, fontsize // 指示を表示 pos ginfo_dispx/2-(strlen(shiji2)*(fontsize/2))/2, ginfo_dispy/2-fontsize/2 mes shiji2 /* repeat // Enterキーを押すと進行 getkey Enter, 13 if Enter = 1 : break wait 1 loop */ WaitKeyInput 13 repeat SESSION_ALL cls 0 repeat getkey B, 66 circle ginfo_dispx/2-100, ginfo_dispy/2-100, ginfo_dispx/2+100, ginfo_dispy/2+100 if B = 1 { break } wait 1 loop wait 1 loop wait 1 loop cls 0 #define shiji3 "終わり" font msGothic, fontsize // 指示を表示 pos ginfo_dispx/2-(strlen(shiji3)*(fontsize/2))/2, ginfo_dispy/2-fontsize/2 mes shiji3 stop



味噌汁にあんこ

リンク

2021/7/10(Sat) 12:22:17|NO.93199

皆さま、回答いただきありがとうございます。
最初のキー押しが次の判定まで生き残っていたわけですね。
勉強になります。

これまではgetkeyに頼りきりでしたが、stickの機能も見直してみることにします。
ご協力ありがとうございました。



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