RPGツクールでは、プレイヤー(アクター)の歩行グラフィックをデータベースから設定できる。しかし、移動していないときも移動しているときも同一のグラフィックが使われるため、別々のグラフィックを表示させることができない。
そこで今回は、待機している(移動していない)ときと移動しているときで別の歩行グラフィックに変える方法を紹介する。
ダッシュ中にグラフィックを変えるプラグインは見つけたけど、移動中にグラフィックを変えるプラグインは見つからなかったので、イベントコマンドで組んでみた。
いちおうキーボードによる移動だけでなく、タップ移動でも機能する。
マップを歩き回るだけなら問題はなさそうだったが、もし不備があったら申し訳ない。
マップイベント作成
マップイベントをひとつ作成する。
今回は、待機中のプレイヤー歩行グラフィックをActor1(0)、移動中のプレイヤー歩行グラフィックをActor1(6)とする。
イベント全体図
トリガー:並列処理
◆条件分岐:スクリプト:$gamePlayer.isMoving() ◆条件分岐:セルフスイッチ AがOFF ◆アクターの画像変更:リード, Actor1(0), Actor1(6), Actor1_1 ◆セルフスイッチの操作:A = ON ◆ :分岐終了 ◆ :それ以外のとき ◆ウェイト:1フレーム ◆条件分岐:スクリプト:$gamePlayer.isMoving() ◆ :それ以外のとき ◆条件分岐:セルフスイッチ AがON ◆アクターの画像変更:リード, Actor1(0), Actor1(0), Actor1_1 ◆セルフスイッチの操作:A = OFF ◆ :分岐終了 ◆ :分岐終了 ◆ :分岐終了
イベント詳細
待機中と移動中で歩行グラフィックを変えるためには、プレイヤーが移動しているかどうかで条件分岐させればいい。しかし、ツクールの標準機能では、プレイヤーの移動の有無を確認することができない。そこでスクリプトを活用する。
$gamePlayer.isMoving()は、プレイヤーが移動中かどうかを識別できるスクリプトだ。移動中ならtrue、移動していない(止まっている)ならfalseが返ってくる。
◆条件分岐:スクリプト:$gamePlayer.isMoving() ◆アクターの画像変更:リード, Actor1(0), Actor1(6), Actor1_1 ◆ :それ以外のとき ◆アクターの画像変更:リード, Actor1(0), Actor1(0), Actor1_1 ◆ :分岐終了
上記の場合だと、移動中であればアクターの歩行グラフィックがActor1(6)に、停止中ならActor1(0)に変更される。
しかし、これだけでは問題がある。
- 絶えず画像変更が実行されてしまう
- 2マス以上移動するとき画像のちらつきがある
ひとつめの問題について、たとえばプレイヤーが停止しているとき、[アクターの画像変更:リード, Actor1(0), Actor1(0), Actor1_1]が実行され続けてしまう。
停止時の画像に変更するコマンドは、最初の1回が実行されれば充分だ。そこで、画像変更をセルフスイッチで制御しよう。
画像を一度変更したら、セルフスイッチAのON/OFFを切り替える。こうすれば、セルフスイッチのON/OFFが変わらない限り、画像変更が再び実行されることはない。
◆条件分岐:スクリプト:$gamePlayer.isMoving() ◆条件分岐:セルフスイッチ AがOFF ◆アクターの画像変更:リード, Actor1(0), Actor1(6), Actor1_1 ◆セルフスイッチの操作:A = ON ◆ :分岐終了 ◆ :それ以外のとき ◆条件分岐:セルフスイッチ AがON ◆アクターの画像変更:リード, Actor1(0), Actor1(0), Actor1_1 ◆セルフスイッチの操作:A = OFF ◆ :分岐終了 ◆ :分岐終了
ふたつめの問題についてだが、キャラクターの動きを観察してみると、どうやら移動し続けているように見えても実際には「移動」と「停止」を1マスごとに繰り返しているようだ。そのため、移動を1マス終えるごとに一瞬だけ停止中の画像に変更されてしまう。これが画像がちらついて見える原因だ。
そこで、ウェイトを挟み、もう一度$gamePlayer.isMoving()でプレイヤーが移動中かどうか判別しよう。
◆条件分岐:スクリプト:$gamePlayer.isMoving() ◆条件分岐:セルフスイッチ AがOFF ◆アクターの画像変更:リード, Actor1(0), Actor1(6), Actor1_1 ◆セルフスイッチの操作:A = ON ◆ :分岐終了 ◆ :それ以外のとき ◆ウェイト:1フレーム ◆条件分岐:スクリプト:$gamePlayer.isMoving() ◆ :それ以外のとき ◆条件分岐:セルフスイッチ AがON ◆アクターの画像変更:リード, Actor1(0), Actor1(0), Actor1_1 ◆セルフスイッチの操作:A = OFF ◆ :分岐終了 ◆ :分岐終了 ◆ :分岐終了
理由はよくわからないけど、なんかこれでうまくいった。たぶん、移動しているかどうかを2フレーム連続で調べることで、1マス移動するごとに生まれる移動と停止が切り替わる瞬間を、スルーしているんだと思う。
以上。よいツクールライフを!
コメント