2024-02-10

ツクールMZ備忘録:足音を鳴らす

Comment ShareLink

活動が滞り気味ですが、今年はSilverHeartsの2作が10周年…実質ゲームプロジェクトが本格始動してから10周年という節目ということで、今サークルでできることを模索中です。
そこで「もし今年中にリメイクするならアイテムやスキル設定の多いRPGよりアドベンチャー」ということで現在、DistortionDreamユガミユメをツクールMZで作れないかという試みをしています。
今後またメンバーのスケジュールや生活面の問題で完成させるとか作るとは断言できないのですが、試みの中で今後も使えることがあったりすればなーと。

今回はこれまでのSilverHearts作品でよく使っていた「足音」を実現させてみようと試みてみました。


プレイヤーやイベントの歩行処理をしているのは mmz_objects.js の「Game_CharacterBase」

まず、歩数カウントと鳴らす・鳴らさないのトリガーとなる変数を Game_CharacterBase.prototype.initMembers = function() {} 内に追加。

this.chara_steps = 0; //足音用歩数
this.chara_step_se = false; //足音スイッチ

で、歩行できたかどうか分岐のある Game_CharacterBase.prototype.moveStraight = function(d) {~if (this.isMovementSucceeded()) {}内に足音の処理を追加。

if (this.chara_step_se) {
  this.chara_steps++;
  if (this.chara_steps % 2) {
   // 地形タグごとに再生するSEファイル名をハッシュに入れておく
   var terrainSe = [null, "Walk1", "Walk2", "Walk3"];
   // 現在位置の地形タグを求める
   var terrainId = $gameMap.terrainTag(this._x, this._y);
   // イベントがプレイヤーとどれくらい距離があるか数値化(縦横の合計値で出してる)
   var p_distance = ($gamePlayer.x + $gamePlayer.y) - (this._x + this._y);
   // terrainId で現在いる位置の地形タグが0以上・プレイヤーとの距離が20以下の場合SEを再生
   if (terrainId > 0 && p_distance < 20) {
    AudioManager.playSe({"name":terrainSe[terrainId], //ハッシュから地形タグと同じ配置のSEを再生
     "volume":(30 + Math.random(10)) - p_distance, //距離でやや音量調整
     "pitch":Math.random(10) + 90, //ピッチはランダムでややブレさせる
    "pan":(($gamePlayer.screenX() / SceneManager._screenWidth) - 0.5) * 300}); //位置でパンを変える
   }
  }
};

これで後は足音を鳴らしたいNPCかプレイヤーキャラの移動ルートからスクリプトで「this.chara_step_se = true;」を実行してあげれば歩いた時に地形に応じて足音が鳴るはず。
このあたりはRGSSでやった時の感覚と似てますね。


これでなんとなくは出るっぽいものの、プレイヤーの移動に関しては上記の方法だとダッシュ・歩きでバラつきが出る気がします。
プレイヤーだけ足音をつけたいなら上のような方法ではなく、 Game_Player.prototype.increaseSteps = function() {} 内に処理を入れたほうがいいかも。
ただその場合 イベントコマンドの移動ルート指定からだと歩数が増加しないので
if (this.isNormal()) {} の条件分岐を消して、歩数増加 $gameParty.increaseSteps(); を無条件で実行にしてから
if ($gameParty._steps % 2) {~※NPCの時と同様に足音鳴らす処理~} を入れるようにすると複雑なことをしなくても足音をつけられます。

移動ルートでパーティ歩数がカウントされないようになっているのは、イベント中にダメージ床や毒ステート効果などが発動しないようになので、別のスイッチで切り替えするだとか別で歩数カウント変数を作ってカウントさせるようにすると良いかもです。


スクリプトの中身に注釈が少なかったので行きつくのに時間がかかりましたが、なんとなく英単語や変数がわかれば検索かけてどこでどんな処理に使われているのかある程度わかるようで安心しました。
alert(確認したい結果); を使いまくって目的の処理を探したりもしてみてます。

category:

コメントを投稿