キーの長押しと短押しを区別する方法(RPGツクールMZ)
拙作「目瞑りコマンドバトル」制作で一番手こずったところです。
「特定のキーを長押しで必殺技、短押しで通常攻撃が出る」ようにしたくて、最初はこんな処理を組んでみました。
◆条件分岐:スクリプト:Input.isLongPressed('ok')
◆【必殺技のイベント】
◆
:それ以外
◆条件分岐:スクリプト:Input.isPressed('ok')
◆【通常攻撃のイベント】
◆
:分岐終了
:分岐終了
ところが。これが全然効かない。
何回やっても通常攻撃しか出ない。
厳密にはキー操作はうまくいった?ように思えた時もあったんですが、再現できず。また、拙作ではトリアコンタン様のピクチャのボタン化プラグイン(PictureCallCommon.js)でピクチャボタンを特定キーと紐づけてみたのですが、そちらの画面上のピクチャボタンでもこの方法では長押しをうまく認識してくれないことが判明。
難しいことはよくわからんのですが、どうもツクールあるいは使用プラグインの仕様?で、キーを押した瞬間に「短押し」フラグが自動で立ってしまい、「長押し」フラグが立つより前にそっちのイベントが起動してしまうようです。
なので、ツクールのイベント上で長押しを検出するための処理を組むことに。
◆条件分岐 :スクリプト:Input.isTriggered('ok')
◆ウェイト:20フレーム
◆条件分岐:スクリプト:Input.isPressed('ok')
◆ループ
◆条件分岐:スクリプト:Input.isPressed('ok')
◆【必殺技のイベント】
:それ以外のとき
◆ループの中断
◆
:分岐終了
◆ウェイト:1フレーム
◆
:以上繰り返し
◆
:それ以外のとき
◆【通常攻撃イベント】
◆
:分岐終了
◆
:分岐終了
この処理の意味するところを(プログラミング能力へっぽこツクラーなりに)解読した結果はこう。
①特定キーが押された時を起点として更に20フレーム後にも同じキーが押されていたら「長押し」という結果を返す→必殺技発動
②20フレーム後に同じキーが押されてなければ「短押し」という結果を返す→通常攻撃発動
③一度「長押し」認定したら、ループ処理でひたすら1フレームごとにそのキーが押されてるかを検知して、キーが押されてる限り「長押し」という結果を返し続ける
・キーが離されたら即ループ中断
ちなみにこの処理組むにあたって、ツクマテさんのこちらの記事を参考にしました。
http://tm.lucky-duet.com/viewtopic.php?t=11442
関係者の方々ありがとうございます!!
これで短押しと長押しで技を分けられるようになりました!
唯一の欠点はキー連打も長押し認定されることですが💦
今回は連打要素使わないのでサクッと割愛!
あ、あと大事なポイントがもう一つ!
ピクチャのボタン化プラグインでピクチャボタン作って特定キーと紐づけてる場合はトリガー種別を「1」じゃなくて「8」にしましょう。
さもないと長押しが検知されません。