RPGツクールMZプラグイン等メモ

 RPGツクールMZのプラグインに関する個人的メモです。
 素材や説明ではなく、単純に個人的メモなので、自分がわかるようにしか書いていません。
 ※単にテンプレートや方法等の意味を記録しただけのものですが、もし利用したい方がいらっしゃいましたら、ご自由に利用してください。
 ※文頭の空白に「全角スペース」を使って体裁を整えているので、コピペ時は注意

<目次>
【テンプレート的な共通処理】
自由にウィンドウを表示するためのプラグインのテンプレート
コマンド選択を表示するためのプラグインのテンプレート改[4.9.8更新]
プラグイン内でウェイトをする処理【成功版】
プラグイン内でピクチャを表示する際の方法[4.2.12]
プラグイン内で「キー入力待ち」をするための方法【完全版】
BGMデータの事前ダウンロード及び使用[6.3.23]update
 
【マップ・イベント操作】
プラグイン内でイベントの位置を変更する方法
変数を使ってイベント(キャラクタ)を移動させる方法【完全版】
マップイベントのメモ欄・名前を読み込む方法
セルフスイッチをスクリプトでON/OFFする方法
マップ各レイヤーのタイルを置き換える方法[4.4.23]
「アニメーションの表示」をスクリプトで実行する方法
「アニメーションの表示」を反転表示する方法
「アニメーションの表示」をピクチャより上に表示させる処理[4.2.12]
移動速度の変更をスクリプトで実行する方法[4.2.20]
「async function」内でコモンイベントを呼び出す方法[4.2.22]
メニュー呼び出しボタンの座標を変更する方法[4.3.29]
「オプション」に項目を追加する方法[4.4.3]
地形タグを取得する方法[4.5.28]
時間で進行する処理をする方法[4.7.18追記]
デフォルト文字色・縁取り色を変更する方法[4.7.16]
文字色をRGBA形式で直接指定する方法[4.7.16]
「文章の表示」中の一部の文字の色をRGBA形式で指定する方法[4.7.16]
「文章の表示」で顔グラフィックを右側に表示する方法[4.7.18]
 
【戦闘関連】
ランダムエンカウント戦闘で敗北時にイベントを実行する方法[5.6.4]
モンスターの画像だけをランダムに変更する方法[5.8.13]
地形タイルに応じて戦闘背景を変更する方法[5.9.17]
 
【基本的な文法】
割り算における「商」と「剰余」
数値と文字列を組み合わせる際の方法
文字列を分解する方法
数字の文字列を数値に変換する方法
配列のソート
配列内の最大値及びそのインデックスを取得する方法
イベント変数をスクリプトで編集する際の方法
オブジェクトの要素を変数で呼び出す方法[4.2.12]
変数「$gameVariables」に小数を代入する方法[4.7.10]
フォルダ内の全ファイル名を配列で取得する方法[4.7.16]
 
【プラグインとは関係ない便利メモ】
ループ付きMIDIをループ付きOGGに変換する手順[4.7.9]


自由にウィンドウを表示するためのプラグインのテンプレート

 中身を自由に編集してウィンドウを表示できるプラグインのテンプレート
 ファイルの中身を直接編集して使用

●ウィンドウ表示テンプレート
(UTF-8のままなので、文字化けした際にはブラウザで再エンコードが必要)



コマンド選択を表示するためのプラグインのテンプレート改

 中身を自由に編集してコマンド選択ウィンドウを表示できるプラグインのテンプレート
 ファイルの中身を直接編集して使用
 「改」バージョンでは、複数のコマンドウィンドウを開いていけるように修正
<イメージ>


●コマンド選択テンプレート0層目Ver20220908
●コマンド選択テンプレート1層目Ver20220908
●コマンド選択テンプレート2層目以降Ver20220908
(UTF-8のままなので、文字化けした際にはブラウザで再エンコードが必要)

【使用時の注意事項】
●この「コマンド選択テンプレート」と上記の「ウィンドウ表示テンプレート」を併用する場合、以下の条件でエラーが出るので処置が必要
<エラーが出る条件>
1 この「コマンド選択テンプレート」を使う前に「ウィンドウ表示テンプレート」を使ってウィンドウを表示していた場合、コマンド選択が終了するとウィンドウが消えるため再度表示する必要がある。この時、「ウィンドウ表示テンプレート」内の「show」と「hide」で設定している「.openness」の数値が異なると、再表示しようとした際にエラーが出る
2 この「コマンド選択テンプレート」の中で「ウィンドウ表示テンプレート」を使ってウィンドウを表示していた場合、コマンド選択が終了するとウィンドウが消える。この消えたウィンドウを再度表示しようとした際、ウィンドウ表示テンプレート」内の「show」と「hide」で設定している「.openness」の数値が異なると、再表示しようとした際にエラーが出る。

<処置>
その1:「show」と「hide」で設定している「.openness」の数値を同じにしておく。または、「hide」で「.openness」を設定しない。
(この場合、ウィンドウの開き方と閉じ方が変わってしまう。)
その2:「コマンド選択テンプレート」内で「hide」により閉じる。この場合は、コマンド選択終了後に表示する際、「.openness」の数値が異なっていてもエラーは生じない。
(この場合、並列して処理しているスクリプトの状況によっては「hide」の処理が終わる前に次の「show」が実行されることがあり、エラーが生じる可能性が残る。)

見た目を気にしないのであれば、「その1」の処置を取った方がエラーが生じる可能性を無くすことができる。

【使用時の注意事項1】
●このコマンド選択の一連の流れの中で、「ウィンドウ表示テンプレート」を使ってウィンドウを表示した場合は、必ず「*.hide();」でそのウィンドウを閉じてからコマンド選択を終了する。
●そうしないと、もう一度同じウィンドウを開こうとした場合、エラーが出てしまう。
●Scene_Jisaku.prototype.popSceneが終了時の処理なので、その中ですべてのウィンドウを閉じる処理を書いておくと、消し忘れを回避できる。
【使用時の注意事項2】
●この「コマンド選択テンプレート」を使う前に、上記の「ウィンドウ表示テンプレート」を使ってウィンドウを表示していた場合、この「コマンド選択テンプレート」が終了した段階で、表示していたウィンドウも一緒に消えてしまう。
●この際、正しい消去法ではないため、再度同じウィンドウを表示しようとしてもエラーが出てしまう。
●直接回避する方法は不明だが、以下の要領のように力技で回避可能
 ・「コマンド選択テンプレート」を使う直前に、表示しているウィンドウを消去
 ・「コマンド選択テンプレート」中、 Scene_Jisaku.prototype.create の内部 this.createCommandWindow(); の後に、新たにウィンドウを表示する処理を追加(これで「コマンド選択ウィンドウ」が表示されると同時に表示したいウィンドウが表示される。)
 ・「コマンド選択テンプレート」中、キャンセル処理の部分(Scene_AtkorSkill.prototype.popScene)に、表示したウィンドウを消去する処理を追加
  (【使用時の注意事項1】にあるように、このコマンド選択処理の中で表示したウィンドウは、閉じるときに消す。)
 ・コマンド選択の処理が終わった直後に、改めてウィンドウを表示


3層目以降も増やしていけることを確認済み。やったぜ。

※ 2021.11.23 オプション的な設定コマンド追記 誤字修正
※ 2022.09.08 「ウィンドウ表示テンプレート」併用時のエラー原因解明に伴う解説・処置追記



プラグイン内でウェイトをする処理【成功版】

●概要
 Javascriptは全ての処理が同時並行的に行われるため、「ウェイトする処理」を単純に呼び出しても、その「ウェイトする処理」も並列処理されてしまい、元の関数ではウェイトがかからない。(非同期処理)
 このため、VXのRGSSのように記述順に処理するためには、「関数を定義する時」と「関数を呼び出す時」に、順番に実施(同期処理)するよう指定する必要がある。

●「ウェイトする処理」の設定
 他の関数から呼び出す処理

 JWait = function(ms){ // 「ms」はミリセカンド
  return new Promise(resolve => setTimeout(resolve, ms));
 }


●「呼び出し側の関数の定義」と「ウェイトする処理の呼び出し方」
 「順番に実施する関数(同期処理の関数)」として定義するために、「async function」と書く。
 「ウェイトする処理」を呼び出す場合は、「await JWait(**)」のように、頭に「await」をつけて呼び出す。

 JWaitTest = async function(){
  // 処理1
  (何かの処理〜〜〜)

  // ウェイト処理
  await JWait(3000); // 3000ms(3秒)ウェイト

  // 処理2
  (何かの処理〜〜〜)
 }


 【処理の流れ】
  処理1
  → 3秒ウェイト
  → 処理2

●関数が複数の階層にまたがる場合
 関数内で関数を呼び出し、複数の階層で構成される関数となった場合、全てを同期処理するためには、「呼び出す関数」の頭に「await」をつける。

 ///////////////////////////////
 // メイン関数
 JWaitTestMain = async function(){
  // 処理1
  (何かの処理1)
  
  // ウェイト処理
  await JWait(3000); // 3000ms(3秒)ウェイト
  
  // サブルーチンの呼び出し
  await JWaitTestSub(); // 「await」を付けて呼び出す
  
  // 処理5
  (何かの処理5)
 }

///////////////////////////////
 // サブルーチン
 JWaitTestSub = async function(){
  // 処理3
  (何かの処理3)
  
  // ウェイト処理
  await JWait(3000); // 3000ms(3秒)ウェイト
  
  // 処理4
  (何かの処理4)
 }


 【処理の流れ】
  処理1
  → 3秒ウェイト
  → サブルーチンの実行(処理3 → 3秒ウェイト → 処理4)
  → 処理5

★処理全体のうち、どこかでウェイト処理をする場合には、非同期処理の必要がない限り、初めから全ての関数を「async function」で定義するとともに、呼び出すときに「await」を付けて呼び出しておくと楽。

【使用上の注意事項】
 イベントコマンド内の「スクリプト」により関数を呼び出した場合、呼び出した関数はイベントコマンドと並列で処理されるので、順番に処理されない。
 この「スクリプト」では、「await」をつけて関数を呼び出すことができないので、関数の処理終了後に次のイベントを実行させたい場合は、以下の工夫が必要。
 ○まず、適当なスイッチを「処理待ちスイッチ」として指定
 ○スクリプトを作成。この際、スクリプトの最後に「処理待ちスイッチをOFF」する処理($gameSwitches.setValue(*, false))を入れる。
 ○イベントコマンドに以下のように記述
 
  〜事前の処理
  ◆スイッチの操作:#0001 処理待ちスイッチ = ON
  ◆スクリプト:JTestScript(); // この関数内部の最後に「処理待ちスイッチ = OFF」の処理を入れる
  ◆ループ
   ◆条件分岐:処理待ちスイッチがOFF
    ◆ループの中断
    ◆
   :分岐終了
   ◆ウェイト:1フレーム
   ◆
  :以上繰り返し
  〜次の処理


 「◆ループ」〜「:以上繰り返し」の部分をコモンイベントにしておくと楽。



プラグイン内でピクチャを表示する際の方法

【単純に一枚絵を表示すればよい場合】
●表示
 $gameScreen.showPicture(番号,"画像の名前",原点,x座標,y座標,幅の拡大率,高さの拡大率,不透明度,合成方法);
 ※イベントコマンドのピクチャ表示を実行する方法だが、プラグイン内でも呼び出せる。

●使用できるピクチャ番号の拡張
 プラグインにて以下を再定義すると、使用できるピクチャ番号の上限が増える。
 Game_Screen.prototype.maxPictures = function() {
  return 600; // この数字を変える。この場合は600番まで上限が増える。
 };

 ※イベントコマンドでの入力は100以上を受け付けないので、
  イベントコマンドの「スクリプト」またはプラグイン内からの呼び出しが必要


【パラパラアニメ等、描画に速度を必要とする場合(スプライトの使用)】

 ※別ページ参照


(参考)スプライト表示の「重なりの優先度」について
 スプライトは「SceneManager._scene.addChild(tPicture);」のように特定のシーンやオブジェクトに「addChild」で追加して表示するが、これらはシーンやオブジェクトごとに「層」に分かれているため、追加する「層」によって「どれが上(画面手前)に表示されるか」が異なる。
 このため、ピクチャや戦闘アニメ、キャラクター等の下に表示したい場合は、スプライトを追加する「層」を変更する必要がある。
 また、それぞれの「層」ごとに「z座標」が設定されるので、下の「層」のz座標をどれだけ大きくしても、上の「層」の下にしか表示されない。
 現在確認したスプライト表示の「重なりの優先度」は次のとおり。(上にある方が、画面手前に表示される。

 
追加する際の処理「層」の説明
 SceneManager._scene.addChild(tSprite);  新たな層を追加するので、一番上に表示される。
 SceneManager._scene.addWindow(tSprite);  各ウィンドウを表示する層だが、ここにスプライトを加えても表示される。
 SceneManager._scene._spriteset.addChild(tSprite);  文字通りスプライトの層だが、別に使わなくてもよい。
 (ピクチャ)  イベントコマンドや$gameScreen.showPicture( );で表示したピクチャの層。
 ここに追加する処理は未確認
 SceneManager._scene._spriteset._tilemap.addChild(tSprite);  マップのやイベントキャラが表示されている層。
 この中で更に「z座標」が指定されており、戦闘アニメやキャラ、タイルの表示の優先度が決められている。
 
z座標内容
9 タッチ位置表示
8 「アニメーションの表示」で表示されるアニメ
7 吹き出し
- 「_tilemap」内でz座標の指定がないスプライトは、このレイヤに表示される
6 飛行船の影
5 イベントの「通常キャラの上」
4 通行設定が「☆」のタイル
3 イベントの「通常キャラと同じ」
2 (未使用らしい)
1 イベントの「通常キャラの下」
0 マップのタイル。この中に「タイル用のレイヤ」が更に分かれている。
 「タイル用のレイヤ」は「マップ各レイヤーのタイルを置き換える方法」を参照
-1〜 マップのタイルの下。タイルが空白になっていると、遠景より上に表示される。
 (遠景)  遠景の層。
 ここに追加する処理は未確認

(参考2)
 z座標は数の大小で上下を判定しているため、小数やマイナスも使うことができる。



プラグイン内で「キー入力待ち」をするための方法【完全版】

●キー入力待ち関数として、以下を定義する。
 なお、以下はスマホの画面タップ、マウスによる左右クリックに対応した記述

 JWaitForKeyInput = async function(){
  var tFlag = 0;
  while(tFlag === 0){
   if(Input.isTriggered("ok") || TouchInput.isTriggered()){
    var tFlag = 1;
   }else if(Input.isTriggered("cancel") || TouchInput.isCancelled()){
    var tFlag = 1;
   }
   await JWait(10); // 0.01ミリ秒ウェイト
  }
 }


※「JWait」の中身は「プラグイン内でウェイトをする処理【成功版】」を参照

●処理する関数を「async function」として定義し、その中で上記の「JWaitForKeyInput」を「await」をつけて呼び出す。

 JWaitForKeyInputTest = async function(){
  // 処理1
  (何かの処理〜〜〜)

  // キー入力待ち処理
  await JWaitForKeyInput();

  // 処理2
  (何かの処理〜〜〜)
 }


 【処理の流れ】   処理1 → キー入力待ち(決定またはキャンセル) → 処理2

(参考1)スマートフォンでの操作要領
 決定:タップ
 キャンセル:二本指タップ

(参考2)マウスでの操作要領
 決定:コマンド選択場所等を左クリック
 キャンセル:右クリック



BGMデータの事前ダウンロード及び使用
※全面改修(すっきりさせました)

●全 般
 ツクールMZではBGMのデータをメモリ上に保持しておらず、演奏する度にデータをサーバ(またはフォルダ)から読み込むとともに、デコード(変換)を行ってから演奏するので、遅延が生じる。
 特にゲームアツマールにアップしたゲームをスマートフォンでプレイする場合、演奏を実行してから1〜2秒の遅延が生じるため、はっきり言ってゲームとしては致命的な状況になる。
 (ピクチャや戦闘アニメは一度表示・実行するとローカルのキャッシュに保存されるため、その後は遅延が生じなくなる。
 一応BGMデータも2回目以降は「ブラウザのキャッシュ」に保存され、そこから読み出されるようになり早くはなるが、やはり遅延は生じてしまう。
 このため、BGMのデータを事前にダウンロードしたデータをキャッシュに保存し、演奏する際にキャッシュのデータを使用するようにすると、遅延がなくなる。(作者のスマートフォンで遅延無しを確認済み)

●以下をプラグインとして読み込み
 BGMプリダウンロード及び使用Ver20240323
(UTF-8のままなので、文字化けした際にはブラウザで再エンコードが必要)
※「進捗表示ウィンドウ」は中に組み込まれています。
※現在のところ、音楽が重なって演奏される不具合あり(修正済み)

 ※上記ファイル中にある「JWait()」は自作関数なので、「プラグイン内でウェイトをする処理【成功版】」を参照

●使い方(スクリプトを直接書き換えることが必要)
1:イベントコマンドでの変数に、音楽関連用変数を1つ割り当て、その番号を「gMN_Music」に設定
  変数2を割り当てた場合、gMN_Music = 2;

2:音楽データの事前ダウンロード時、進捗を表すウィンドウを表示するかどうかについて
  AudioManager._tShowLoadingWindowを設定(表示するならtrue、しないならfalse

3:ゲーム開始後、JInitializePlayingBGMFileName();を実行(一度だけでよい)
  あとはイベントコマンドやスクリプトなどで音楽が演奏されれば、
  自動でメモリにバッファされ、再演奏の際はメモリから読み込むようになりすぐ演奏を開始できる
  (セーブ後に再開した場合はバッファされたデータが消えているので注意)

4:音楽データの事前ダウンロードをする場合
 ○ 事前にそのシーンで使用する音楽の「ファイル名」(拡張子なし)をリストアップし、専用変数に代入
  ファイル名は自由に設定できる(ファイル名にID番号をつけなくてもよい)
 (書き方)
   var tFileNameList = ["02_勝利ジングル04", "05_フィールド4", "07_コミカル", "03_ぜんめつ"];
   $gameVariables.value(gMN_Music).tSceneBGMList = tFileNameList;

 ○ 事前ダウンロード関数を実行
   AudioManager.jPreLoad();
 ○ イベントコマンドのスクリプトで呼び出す場合、AudioManager.jPreLoad()は並列処理されてしまい、
  事前ダウンロードが完了する前に次の処理が実行されてしまうため、イベントコマンド側で処理終了までウェイトする処置が必要
  (事前ダウンロード終了後、AudioManager._preLoadingFlagfalseになるよう設定済み)
 ※イベントコマンドで呼び出す場合の書き方
  ◆スクリプト:$gameVariables.value(tMN_Music).tDownLoadBGMID = ["02_勝利ジングル04", "05_フィールド4"];
         AudioManager.jPreLoad();
  ◆ループ
   ◆条件分岐:スクリプト:AudioManager._preLoadingFlag === false;
    ◆ループの中断
    ◆
   :分岐終了
   ◆ウェイト:1フレーム
  ◆
  :以上繰り返し


5:セーブして再開した時の状態
 事前ダウンロードにおいて$gameVariables.value(gMN_Music).tSceneBGMListにファイル名を代入していたファイルは、
 セーブデータから再開する際に再度事前ロードされる。


(参考)
 デコーダデータバッファバージョンファイル
 進捗表示用ウィンドウVer20230815




プラグイン内でイベントの位置を変更する方法

 $gameMap._events[マップイベントのID].setPosition(マップのX座標, マップのY座標);



変数を使ってイベント(キャラクタ)を移動させる方法【完全版】

●処理するための関数は、「async function」として定義しておく。

●定義した関数内に以下を記載することで実行可能

 var tEventID = マップイベントID;
 var tDirection = 移動させる方向;
 $gameMap.event(tEventID).moveStraight(tDirection);

 
 「移動させる方向」には数字を指定
 
方向
指定する数字 2468
 ※テンキーに対応(R4.2.8修正)

●連続して移動させる場合、1マス分の移動が完了するまで次の処理を待たなければならないことから、「同期処理」で実行する。
 (以下を処理する関数については、「async funciton」で定義する。

 // 移動処理
 var tEventID = マップイベントID;
 var tDirection = 移動させる方向;
 $gameMap.event(tEventID).moveStraight(tDirection);
 // 移動完了までウェイト
 while($gameMap.event(マップイベントID).isMoving() === true){ // 移動中なら動作を繰り返す
  await JWait(10); // 0.01秒ウェイト
 }


※「JWait」の中身は「プラグイン内でウェイトをする処理【成功版】」を参照



マップイベントのメモ欄・名前を読み込む方法

●マップイベントの「メモ:」欄に書いた内容は、以下の方法で「文字列」として読み込むことが可能。

 var tMapEventData = $gameMap.event(マップイベントID).event(); // 右の「event()」内は何も書かなくてよい
 var tMemoText = tMapEventData.note; // マップイベントの配列のうち、「メモ:」のデータを取得


●イベントID「8」のマップイベントについて、「メモ:」欄に「1」と書いていた場合
 var tMapEventData = $gameMap.event(8).event();
 var tMemoText = tMapEventData.note;
 console.log(tMemoText);

 →表示結果: "1"
  「文字列」として「メモ:」欄が取得される。
  中身が数字だけでも、取得されるのは「文字列」なので、数値として使用する場合は、「数字の文字列を数値に変換する方法」を使う必要あり。

●「メモ:」欄に「1:21:テスト名」と記入しておくと、"1:21:テスト名"の文字列が取得できるので、「文字列を分解する方法」と「数字の文字列を数値に変換する方法」を両方使えば、複数データの配列([1, 21, "テスト名"])に変換できる
 これを利用すれば、簡単なデータを配列で保管することが可能

●マップイベントの「名前:」は、以下の方法で読み込むことが可能
 var tMapEventData = $gameMap.event(マップイベントID).event(); // 右の「event()」内は何も書かなくてよい
 var tMemoText = tMapEventData.name; // マップイベントの配列のうち、「名前:」のデータを取得




セルフスイッチをスクリプトでON/OFFする方法

●ONにする場合
 $gameSelfSwitches.setValue([マップID, イベントID, "A"], true);
 (「A」をB〜Dに変えれば、それぞれのスイッチを変更できる。)
●OFFにする場合
 $gameSelfSwitches.setValue([マップID, イベントID, "A"], false);
 (「A」をB〜Dに変えれば、それぞれのスイッチを変更できる。)

<参考>
●マップIDの取得
 var tMapID = $gameMap.mapId();
●特定座標のイベントIDの取得
 var tEventID = $gameMap.eventIdXy(X座標, Y座標);



マップ各レイヤーのタイルを置き換える方法

●マップ座標(x, y)のタイル置き換え
 $dataMap.data[ (レイヤz座標 * $dataMap.height + マップy座標) * $dataMap.width + マップx座標 ] = タイルID;

※レイヤz座標
 0:エディタ上のレイヤ1
 1:エディタ上のレイヤ2
 2:エディタ上のレイヤ3
 3:エディタ上のレイヤ4
 4:(「影」らしい)
 5:エディタ上のリージョン「R」

※この方法でタイルを置き換えた場合、「シーンの切り替わり」が発生すると、元に戻ってしまう。
 (別のマップに移動し戻ってきたり、メニューの開閉・上記のコマンドウィンドウを表示・消去すると、マップの元データであるMap***.jsonが再度読み込まれ、$dataMapが初期化されるため、元のタイルに戻る。)
 メニューの開閉ごとに元に戻るのを回避するためには、書き換えた内容をリスト化しておき、マップのデータを読み込んだ後に再度書き換える処理を追加する。

 ↓以下の処理は、「マップを移動してもタイルを変更したまま」にはできないことに留意
 ○リストは、ステージごとのイベント変数(ここでは\V[90])に以下の配列を書き込みしておく。(書き換えるたびにpushで追加する等)
 [0, [tHexX, tHexY, tLayerZ, tChangeTileId], [tHexX, tHexY, tLayerZ, tChangeTileId], …(必要な個数) ]
 
tHexXマップx座標
tHexYマップy座標
tLayerZレイヤz座標
tChangeTileId置き換えるタイルID

 ○プラグインにより、マップデータ読み込み処理のスクリプトを以下のように上書き
 DataManager.loadMapData = async function(mapId) { // ★★「async function」に変更
  if (mapId > 0) {
   const filename = "Map%1.json".format(mapId.padZero(3));
   this.loadDataFile("$dataMap", filename);

   // ↓★★ここから追加部分
   while(DataManager.isMapLoaded() === false){
    await JWait(1); // マップデータ読み込み完了までウェイト
   }
   JChangeAllTile(); // リストに基づきタイルを書き換える自作関数(後述)
   // ↑★★ここまで追加部分

  } else {
   this.makeEmptyMap();
  }
 };


 ○リストに基づきタイルを書き換える自作関数
 JChangeAllTile = function(){
  if($gameVariables.value(90).length >= 2){ // リストに項目がある場合
   for(let i = 1; i < tLength; i++){
    var tHexX = $gameVariables.value(90)[i][0]
    var tHexY = $gameVariables.value(90)[i][1]
    var tLayerZ = $gameVariables.value(90)[i][2]
    var tChangeTileId = $gameVariables.value(90)[i][3]
    $dataMap.data[(tLayerZ * $dataMap.height + tHexY) * $dataMap.width + tHexX ] = tChangeTileId;
   }
  }
 }


●タイル素材ID番号
 ○Aタイル:番号指定が特殊であるため、実際に作ったマップから以下の方法で取得し確認
  var tMapTileID = $gameMap.tileId(x, y, レイヤz座標);
  console.log(tMapTileID);

 ○B〜Eタイル
  Bタイルの左上が「0」であり、右に行くに従い+1
  1行目は「0」〜「7」、2行目は「8」〜「15」となる
  1枚あたり256タイルあるので、Cタイルの左上は256から
  「リージョン」は独立した別のIDを持っており、左上が「0」から始まる。
 
区分左上のID右下のID
Bタイル0255
Cタイル256511
Dタイル512767
Eタイル7681023
リージョン0255

<参考>地形タグの取得について
 特定の座標の地形タグは以下で取得可能
 var tTerrainTag = $gameMap.terrainTag(マップx座標, マップy座標);
 ただし、エディタにおいて上層タイルを置いた場合には、一番上のレイヤにあるタイルの地形タグだけが取得される



「アニメーションの表示」をスクリプトで実行する方法

●マップイベントを対象にする場合
 var tTarget = $gameMap.event(マップイベントID);
 var tAnimeID = アニメーションのID;
 $gameTemp.requestAnimation([tTarget], tAnimeID);


●プレイヤーを対象にする場合
 var tTarget = $gamePlayer;
 var tAnimeID = アニメーションのID;
 $gameTemp.requestAnimation([tTarget], tAnimeID);


※ イベントコマンドのスクリプトからでも、プラグイン内からでも呼び出しできる。



「アニメーションの表示」を反転表示する方法

●適当なスイッチを反転用スイッチとして設定する。
 例:スイッチ1 反転表示用スイッチ

●プラグインによりアニメーション処理のスクリプトを以下のように上書き

 Game_Temp.prototype.requestAnimation = function(
  targets, animationId, mirror = false
 ) {
   // ↓★★ここから追加部分
   if($gameSwitches.value(1) === true){
     mirror = true;
   }
   // ↑★★ここまで追加部分
   if ($dataAnimations[animationId]) {
     const request = {
      targets: targets,
      animationId: animationId,
      mirror: mirror
     };
     this._animationQueue.push(request);
     for (const target of targets) {
       if (target.startAnimation) {
         target.startAnimation();
       }
     }
   }
 };


●使い方は、該当するスイッチをONにして実行するだけ



「アニメーションの表示」をピクチャより上に表示させる処理

●通常、アニメーションはピクチャより下に表示されるが、それはアニメーションを表示する層が、ピクチャの層より下にあるため。
 このため、アニメーションのスプライトをピクチャより上の層に表示するよう修正すればよい。
 (重なりの優先度の細部は「プラグイン内でピクチャを表示する際の方法」参照)

●プラグインによりアニメーション処理のスクリプトを以下のように上書き

 Spriteset_Base.prototype.createAnimationSprite = function(
  targets, animation, mirror, delay
 ) {
  const mv = this.isMVAnimation(animation);
  const sprite = new (mv ? Sprite_AnimationMV : Sprite_Animation)();
  const targetSprites = this.makeTargetSprites(targets);
  const baseDelay = this.animationBaseDelay();
  const previous = delay > baseDelay ? this.lastAnimationSprite() : null;
  if (this.animationShouldMirror(targets[0])) {
    mirror = !mirror;
  }
  sprite.targetObjects = targets;
  sprite.setup(targetSprites, animation, mirror, delay, previous);

  // ↓★★ここから修正部分
  //this._effectsContainer.addChild(sprite); // 元の文
  SceneManager._scene.addChild(sprite); // 書き換えた文。とりあえず一番上に表示
  // ↑★★ここまで修正部分

  this._animationSprites.push(sprite);
 };

●上の例はとりあえず一番上に表示するもの。
 「SceneManager._scene.addChild(sprite);」の部分を「SceneManager._scene._spriteset.addChild(sprite);」にすれば、ピクチャ以上ウィンドウ以下の層に表示できる。
 なお、通常の設定では「SceneManager._scene._spriteset._tilemap」の「z座標 8」に表示されるが、この数値を変更したい場合は、以下をプラグインにより上書きする。

 Sprite_Animation.prototype.initMembers = function() {
  this._targets = [];
  this._animation = null;
  this._mirror = false;
  this._delay = 0;
  this._previous = null;
  this._effect = null;
  this._handle = null;
  this._playing = false;
  this._started = false;
  this._frameIndex = 0;
  this._maxTimingFrames = 0;
  this._flashColor = [0, 0, 0, 0];
  this._flashDuration = 0;
  this._viewportSize = 4096;
  this._originalViewport = null;
  this.z = (★★ここの数値を書き換え); // デフォルト値は 8
 };




移動速度の変更をスクリプトで実行する方法

●プレイヤーの移動速度を変更する場合
 $gamePlayer.setMoveSpeed(移動速度);

●マップイベントの移動速度を変更する場合
 $gameMap.event(イベントID).setMoveSpeed(移動速度);

※「移動速度」の数値
 
数値移動速度
1 1/8倍速
2 1/4倍速
3 1/2倍速
4 通常速
5 2倍速
6 4倍速
7 4倍速+ダッシュ分 
8 「7」より速い
 正確な速度未確認 
 (9以上は差がないと思われる。)



「async function」内でコモンイベントを呼び出す方法

●コモンイベントの「トリガー」は「並列処理」とし、適当なスイッチを割り当てておく
 コモンイベントの最後に、「割り当てたスイッチをOFFにする処理」を入れる

●スクリプト「async function」内でスイッチをONにし、その後、「スイッチがONの間ループ」の処理を入れておく

 JTestCallCommonEvent = async function(){
  // 何かの処理
  〜〜〜
  // コモンイベントの呼び出し
  $gameSwitches.setValue(1, true); // 割り当てたスイッチのON
  // コモンイベント終了までウェイト
  while($gameSwitches.value(1) === true){ // 割り当てたスイッチがONの間ループ
   await JWait(1);
  }

  // 次の処理
  〜〜〜
 }


※単純に「$gameTemp.reserveCommonEvent(コモンイベントID)」で呼び出すと、実行中のスクリプトが終了するまでコモンイベントが実行されないため、スクリプトと並列に処理させることが必要になる



メニュー呼び出しボタンの座標を変更する方法

 以下の処理をプラグインにより上書き

 Scene_Map.prototype.createMenuButton = function() {
  this._menuButton = new Sprite_Button("menu");
  this._menuButton.x = (ここにX座標);
  this._menuButton.y = (ここにY座標);
  this._menuButton.visible = false;
  this.addWindow(this._menuButton);
 };




「オプション」に項目を追加する方法

●「オプション」には、「ON/OFFで設定する項目」と「%の数字を設定する項目」があるが、ここでは「ON/OFFで設定する項目」を追加する方法を記載

●以下の処理をプラグインにより上書き(1個項目を追加する場合)
○「オプション」の項目数を変更
 Scene_Options.prototype.maxCommands = function() {
  // Increase this value when adding option items.
  return 8; // ★ここを変更。デフォルト値は7
 };


○「オプション」の項目を追加
 Window_Options.prototype.addGeneralOptions = function() {
  this.addCommand(TextManager.alwaysDash, "alwaysDash");
  this.addCommand(TextManager.commandRemember, "commandRemember");
  this.addCommand(TextManager.touchUI, "touchUI");
  // ↓★★ここから追加項目
  this.addCommand("追加項目", "tsuikaKoumoku"); // 表示名:「追加項目」。処理の名称:「tsuikaKoumoku」
  // ↓★★ここまで追加項目
 };


○追加した項目の「ON/OFF」状態を記録する要素(プロパティ)を設定・初期値代入
 ConfigManager.tsuikaKoumoku = false; //(4.4.3修正)


●簡単な補足説明
○まず、「オプション」の項目数は「Scene_Option」で設定されているため、これの数値を変更。変更しない場合はウィンドウが大きくならず、下の項目はスクロールさせないと表示されなくなる。
○「オプション」の項目は「Window_Options.prototype.makeCommandList」で作成しているが、この中で「ON/OFFで設定する項目」と、「%の数字を設定する項目」を設定する関数を呼び出している。
 Window_Options.prototype.makeCommandList = function() {
  this.addGeneralOptions(); // ←「ON/OFFで設定する項目」を設定
  this.addVolumeOptions(); // ←「%の数字を設定する項目」
 };

 
 今回は「ON/OFFで設定する項目」に追加するので、「this.addGeneralOptions」すなわち「Window_Options.prototype.addGeneralOptions」の中に項目を追加する。
 ここで記述した順番通りに上から表示されるので、順番を入れ替えたい場合は、記述する行を入れ替えればよい。
 「処理の名称」を決める際、名称の中に「Volume」の文字を入れないように注意すること。ツクールMZの処理では、「ON/OFFで設定する項目」か「%の数字を設定する項目」かを判断するために、この「処理の名称」に「Volume」の文字列が含まれているかいないかで判定している。したがって、「Volume」の文字列を入れると「%の数字を設定する項目」になってしまう。
 ちなみに判定の処理は「Window_Options.prototype.statusText」で行われており、内容は「『Volume』の文字列が含まれている場合は%の数値を変更する処理を実行し、含まれていない場合はON/OFFの切り替えの処理を実行する」という処理になっている。
○「オプション」の設定値は「ConfigManager」の要素(プロパティ)として記録されている。要素(プロパティ)の名前は「Window_Options.prototype.addGeneralOptions」で設定した「処理の名称」と同じ文字列にする。
○「オプション」で設定した内容を処理に反映したい場合は、「ConfigManager.(要素名)」に「ONの場合はtrue」、「OFFの場合はfalse」が代入されているので、if文等で処理を分岐させる。
 例:
 if(ConfigManageer.tsuikaKoumoku === true){
  // 設定が「ON」の場合の処理
  〜〜
 }else {
  // 設定が「OFF」の場合の処理
  〜〜
 }


※「%の数字を設定する項目」を追加する場合の参考(未検証
 基本的には同じで、項目の追加はWindow_Options.prototype.addVolumeOptions」に記述すればよいはず。
 ただし、設定値の記録は「defineProperty」という関数を使って設定しているので、こちらの関数を新たに設定する必要があると思われる。(繰り返すが、未検証
 「defineProperty」を使っての設定については、以下に一例を記載
 Object.defineProperty(ConfigManager, "bgmVolume", {
  get: function() {
   return AudioManager._bgmVolume;
  },
  set: function(value) {
    AudioManager.bgmVolume = value;
  },
  configurable: true
 });




地形タグを取得する方法

●「エディタ上のレイヤ」において、「一番上の0以外の地形タグ」を取得したい場合は次で取得できる。
 var tTag = $gameMap.terrainTag (x, y);

※ 上記における「一番上の0以外の地形タグ」について
 
レイヤ区分地形タグ
レイヤ1
レイヤ2
レイヤ3
レイヤ4
 という設定だった場合、レイヤ3の地形タグ「2」が取得できる。

●各「エディタ上のレイヤ」の地形タグを取得したい場合は、以下の処理を使用
 Game_Map.prototype.terrainTagKai = function(x, y, z) {
  // 地形タグ配列初期化
  var tagArray = [];

  if (this.isValid(x, y)) {
   const flags = this.tilesetFlags();
   const tiles = this.layeredTiles(x, y);
   for (const tile of tiles) {
    const tag = flags[tile] >> 12;
    tagArray.push(tag);
   }
  }

  // レイヤ換算
  // 地形タグ配列とレイヤの順番が逆なのでひっくり返す
  const layer = 4 - z;

  if(tagArray){
   return tagArray[layer];
  }else {
   return 0;
  }
 };


 上記をプラグインとして読み込み、以下で取得
 var tTag = $gameMap.terrainTagKai(x, y, z);
 ※ zはエディタ上のレイヤの区分



時間で進行する処理をする方法

●単純にプレイ中の時間経過のみで判定する方法と、ゲームを中断している間の時間経過も含めて判定する方法の2種類がある。

●「プレイ中の時間経過のみで判定する方法」
 プレイ時間を取得し、その差分で判定すればよい。
 var tPlayTimeSec = $gameSystem.playtime(); // プレイ時間の秒数に換算した値を取得
 ※ 「60フレームで1秒加算」という処理のため、他の処理の状況によってはかなりズレる

(参考)
 プレイ時間を表示するために、「時間:分:秒」の文字列で取得する場合は次の通り
 var tPlayTimeText = $gameSystem.playtimeText();

●「ゲームを中断している間の時間経過も含めて判定する方法」
 Javascriptの基本関数で現在日時を取得できるものがあるので、それを使い判定すればよい。
 Javascript内では、「1970/1/1からどれだけミリ秒が経過したか」(ここでは「累積ミリ秒」と表現)を持っているので、その数値の差分を使う。

 var tDateObj = new Date(); // 現在時刻のオブジェクトを生成
 var tNowTime = tDateObj.getTime(); // 現在の累積ミリ秒を取得


 ここで取得した累積ミリ秒を、それぞれの単位に換算して差分を取ればいい。
 例:「秒」で判定する場合 1000で割る
   「分」で判定する場合 60000で割る
   …

(参考)
 年、月、日、時、分…それぞれで取得できる。ので、比較にするには同じ単位に換算が必要
 生成後、以下で各要素を取得できる。
 
var tYear = tDateObj.getFullYear();「年」を取得
var tMonth = tDateObj.getMonth();「月」を取得
取得できる数値は、「月−1」の値(1月なら0)
これは換算を容易にするためのもの
var tDate = tDateObj.getDate();「日」を取得
var tHour = tDateObj.getHours();「時」を取得
var tMinute = tDateObj.getMinutes();「分」を取得
var tSecond = tDateObj.getSeconds();「秒」を取得
var tMiliSecond = tDateObj.getMilliseconds();「ミリ秒」を取得
var tDayOfWeek = tDateObj.getDay();「曜日」を取得
曜日の値は別表参照
 
月曜日:0
火曜日:1
水曜日:2
木曜日:3
金曜日:4
土曜日:5
日曜日:6



デフォルト文字色・縁取り色を変更する方法

● 以下の処理をプラグインにより上書き

 Window_Base.prototype.resetTextColor = function() {
  this.changeTextColor("ここで呼び出す「ColorManager」の種類を変更する");
  this.changeOutlineColor("ここで呼び出す「ColorManager」の種類を変更する");
 };


 「changeTextColor」のところで文字の色を変更
 「changeOutlineColor」のところで縁取りの色を変更

例:
 Window_Base.prototype.resetTextColor = function() {
  this.changeTextColor(ColorManager.crisisColor()); // 文字色を黄色に変更
  this.changeOutlineColor(ColorManager.deathColor()); // 縁取り色を赤色に変更
 };



(参考)各「ColorManager」の種類とその色
種類色の概要「文章の表示」での色指定
ColorManager.normalColor\C[0]
ColorManager.systemColorくすんだ水色\C[16]
ColorManager.crisisColor黄色\C[17]
ColorManager.deathColor赤色\C[18]
ColorManager.gaugeBackColor暗い紺色\C[19]
ColorManager.hpGaugeColor1濃い橙色\C[20]
ColorManager.hpGaugeColor2薄い橙色\C[21]
ColorManager.mpGaugeColor1暗い青色\C[22]
ColorManager.mpGaugeColor2水色\C[23]
ColorManager.mpCostColor水色\C[23] (mpGaugeColor2と同じ)
ColorManager.powerUpColor黄緑色\C[24]
ColorManager.powerDownColor茶色\C[25]
ColorManager.ctGaugeColor1青紫色\C[26]
ColorManager.ctGaugeColor2桃色\C[27]
ColorManager.tpGaugeColor1緑色\C[28]
ColorManager.tpGaugeColor2薄い緑色\C[29]
※「\」はバックスラッシュの代わり



文字色をRGBA形式で直接指定する方法

● 色々なスクリプト内で呼び出している「ColorManager.〜〜」を
 「"rgba(0, 0, 0, 255)"」に差し替えるとよい

● rgbaのパラメータは次の通り
 rgba(, 緑, , 不透明度)

例:
 this.changeTextColor(ColorManager.crisisColor());
 →this.changeTextColor("rgba(0, 0, 0, 255)"); // ここでは黒、不透明




「文章の表示」中の一部の文字の色をRGBA形式で指定する方法

● 文字色の制御文字は、システムピクチャである「Windows.png」内の32色が割り当てられ、「文章の表示」中では「\C[n]」(nは0〜31)で指定する。
 (ここでの\はバックスラッシュの代わり)
 この際、nに32番以降を指定しても黒になるだけだが、その32番以降にRGBA形式で直接色を割り当てる

● 以下の処理をプラグインにより上書き

 ColorManager.textColor = function(n) {
  if(n === 99){ // 0〜31以外の数値を指定(ここでは\C[99]に割り当て)
   return "rgba(255, 0, 0, 255)"; // RGBA形式で指定(ここでは赤を指定)
  }else {
   const px = 96 + (n % 8) * 12 + 6;
   const py = 144 + Math.floor(n / 8) * 12 + 6;
   return this._windowskin.getPixel(px, py);
  }
 };


● 「文章の表示」で、色を割り当てた制御文字「\C[99]」を使用



「文章の表示」で顔グラフィックを右側に表示する方法

● フラグとして適当なスイッチを割り当て、以下の処理をプラグインにより上書き
 (ここではスイッチ1)
 Window_Message.prototype.drawMessageFace = function() { // 「文章の表示」で顔グラを描画する関数
  const faceName = $gameMessage.faceName();
  const faceIndex = $gameMessage.faceIndex();
  const rtl = $gameMessage.isRTL();
  const width = ImageManager.faceWidth;
  const height = this.innerHeight;
  if($gameSwitches.value(1) === false){ // スイッチOFFの場合
   // デフォルト処理
   const x = rtl ? this.innerWidth - width - 4 : 4;
   this.drawFace(faceName, faceIndex, x, 0, width, height);
  }else { // スイッチONの場合
   const x = this.innerWidth - width - 4;
   this.drawFace(faceName, faceIndex, x, 0, width, height);
  }
 };

 Window_Message.prototype.newLineX = function(textState) { // 文章の座標を決定する関数
  const faceExists = $gameMessage.faceName() !== "";
  const faceWidth = ImageManager.faceWidth;
  const spacing = 20;
  const margin = faceExists ? faceWidth + spacing : 4;
  if($gameSwitches.value(1) === false){ // スイッチOFFの場合
   // デフォルト処理
   return textState.rtl ? this.innerWidth - margin : margin;
  }else { // スイッチONの場合
   return 4;
  }
 };


● 使い方は、イベントコマンドで割り当てたスイッチをONにしてから「文章の表示」を実行すればよい。




ランダムエンカウント戦闘で敗北時にイベントを実行する方法

●適当なスイッチを敗北イベント実行用スイッチとして設定する。
 例:スイッチ1 敗北イベント

●以下のスクリプトを上書き
○ランダムエンカウント戦闘で敗北してもゲームオーバーにならなくなる処理
 (イベントの戦闘の処理で敗北可とした時と同じ処理(HP1でゲーム続行)となる)
 BattleManager.setup = function(troopId, canEscape, canLose) {
  this.initMembers();
  this._canEscape = canEscape;
  //this._canLose = canLose; // 元の処理
  this._canLose = true; // 追加部分
  $gameTroop.setup(troopId);
  $gameScreen.onBattleStart();
  this.makeEscapeRatio();
 };

 
○敗北時にスイッチ(ここでは1)をONにする処理
 BattleManager.updateBattleEnd = function() {
  if (this.isBattleTest()) {
   AudioManager.stopBgm();
   SceneManager.exit();
  } else if (!this._escaped && $gameParty.isAllDead()) {
   if (this._canLose) {
    $gameParty.reviveBattleMembers();
    $gameSwitches.setValue(1, true); // 追加部分
    SceneManager.pop();
   } else {
    SceneManager.goto(Scene_Gameover);
   }
  } else {
   SceneManager.pop();
  }
  this._phase = "";
 };

●敗北後に実行されるコモンイベントを作成
○コモンイベントの基本設定
 トリガー:自動実行、 スイッチ:0001 (敗北イベントに割り当てたスイッチ)
○コモンイベントの中身
 まず「スイッチ1をOFF」にして、コモンイベントが再度実行されないようにする。
 あとは必要なイベントを実行
※敗北イベント後にゲームオーバーにしたい場合は、このコモンイベントの最後に「ゲームオーバーの処理」を入れればよい。
※敵の種類ごとにイベントを分けたい場合は、敵グループ中バトルイベントの設定で、戦闘開始時(ターン1のとき)に適当な変数にID番号を入れ、敗北コモンイベント実行時に条件分岐させる。
※この処理では敗北後に必ずコモンイベントが実行されるが、特にイベントを起こしたくない場合は、上のID番号の一つを「何も処理しないで終わる」処理にすればよい。「0」とか。



モンスターの画像だけをランダムに変更する方法

●適当なスイッチをランダム変更実行用スイッチとして設定する。
 例:スイッチ1 ランダム変更

●以下のスクリプトを上書き
 Sprite_Enemy.prototype.loadBitmap = function(name) {
  // ここから追加部分
  if($gameSwitches.value(1) === true){ // スイッチの番号を変えたい場合は「1」を変える
   // 次のnameList内に差し替える画像のファイル名(拡張子無し)を打ち込み
   vart tNameList = ["Gnome","Goblin","God_of_light","Goddess","Goddess_of_death"];
   var tListNumber = tNameList.length;
   var name = tNameList[ Math.floor( Math.random() * tListNumber) ];
  }
  // ここまで追加部分
  if ($gameSystem.isSideView()) {
   this.bitmap = ImageManager.loadSvEnemy(name);
  } else {
   this.bitmap = ImageManager.loadEnemy(name);
  }
 };


●解説
○「tNameList」に変更させたい画像のファイル名(拡張子無し)を打ち込むと、出現した敵の画像が打ち込んだ画像のいずれかに差し変わる。
 (見た目だけ変化しているだけでステータスは同じ)
○「tNameList」に書き込む種類が多い場合は、別の関数で作っておくと整理しやすい。



地形タイルに応じて戦闘背景を変更する方法

●以下のスクリプトを上書き
 // 戦闘背景1の処理
 Game_Map.prototype.battleback1Name = function() {
  var tMapTileID = $gameMap.tileId($gamePlayer.x, $gamePlayer.y, 0); // ( )内の数字はマップのレイヤ。
  if(tMapTileID === 2816){ // ここの数字はタイルID
   return "Castle1"; // 戦闘背景のファイル名(拡張子無し)
  }else if(mapTileID === 3246){ // ここの数字はタイルID
   return "Crystal"; // 戦闘背景のファイル名(拡張子無し)
  // 以下、必要に応じ分岐を増やす
  }else {
   return this._battleback1Name;
  }
 };

 // 戦闘背景2の処理  Game_Map.prototype.battleback2Name = function() {
  var tMapTileID = $gameMap.tileId($gamePlayer.x, $gamePlayer.y, 0);
  if(tMapTileID === 2816){ // ここの数字はタイルID
   return "Castle1"; // 戦闘背景のファイル名(拡張子無し)
  }else if(mapTileID === 3246){ // ここの数字はタイルID
   return "Crystal"; // 戦闘背景のファイル名(拡張子無し)
  // 以下、必要に応じ分岐を増やす
  }else {
   return this._battleback2Name;
  }
 };

●解説
○ 主人公キャラがいる位置の地形タイルのIDを読み込み、それに応じた戦闘背景を設定する。
○ AタイルはID番号が特殊なので注意が必要。




割り算における「商」と「剰余」

●「商」の計算方法
 Javascriptでは「/」で割り算すると小数で答えを出す。
 (例:10 / 4 = 2.5)
 このため、「商」を求めるには、小数点以下を切り捨てることが必要
 var tValue = Math.floor(10 / 4); // 「Math.floor()」は小数点以下切り捨ての処理
 console.log(tValue);
 → 2


●「剰余」の計算方法
 「剰余」(余り)は他の言語と同じで「%」でよい。
 (例:10 % 7 → 3)

※「Math」により絶対値を求めることも可能
 var tValue = Math.abs(変数); // 「変数」の絶対値を求める処理



数値と文字列を組み合わせる際の方法

 数値を代入した変数と、文字列を代入した変数を単純に足し合わせると、特に変換処理をしなくても、両方が連続した「文字列」になる。

例:
 var x = 1; // 数値
 var y = "test" // 文字列
 var z = x + y;
 
 console.log(z);

 →表示結果: 1test



文字列を分解する方法

 任意の区切り文字を挟んだ文字列について、以下の処理で分割可能

 var tText = "test1:test2:test3"; // 元の文字列
 var tTextArray = tText.split(":"); // 「:」を区切り文字として区切る処理

 console.log(tTextArray);

 →表示結果: ["test1", "test2", "test3"]
  「:」で区切られた文字列の配列が作られる。



数字の文字列を数値に変換する方法

 「1」「003」等の数字が文字列として存在する場合、以下の処理で数値に変換可能

 var tText1 = "1";
 var tValue1 = parseInt(tText1);

 var tText2 = "003";
 var tValue2 = parseInt(tText2);

 console.log(tValue1, tValue2);

 →表示結果: 1, 3
  それぞれ数値になる。「003」は頭の「00」が消える。
  (これ以外にも変換方法はある)



配列のソート

●昇順のソート
 配列.sort(function(a,b){
  if(a < b) return -1;
  if(a > b) return 1;
  return 0;
 });

●降順のソート(昇順のソートとは不等号の向きが逆)
 配列.sort(function(a,b){
  if(a > b) return -1;
  if(a < b) return 1;
  return 0;
 });

※例:配列 [5, 3, 9, 1, 10] の場合
 var tArray = [5, 3, 9, 1, 10];
 tArray.sort(function(a,b){
  if(a < b) return -1;
  if(a > b) return 1;
  return 0;
 });

 console.log(tArray);
 → [1, 3, 5, 9, 10]




配列内の最大値及びそのインデックスを取得する方法

●配列内の最大値を取得
 let max = 配列名.reduce(function(a,b){return Math.max(a,b);});
 (Math.maxMath.minに変えると最小値が取得できる。)
※ 1つの文にすると長くなるので、適当な変数にfunction〜を代入し、2行目で使う方法もあり
 const aryMax = function(a,b){return Math.max(a,b);};
 let max = 配列名.reduce(aryMax);


●最大値のインデックス(配列の何番目か)を取得
 最大値「max」を上記のように取得したとして、
 let maxIndex = 配列名.indexOf(max);
 で取得できる。
※ 「配列名.indexOf(数値);」は、「数値」と一致する要素のインデックスを取得するもの



イベント変数をスクリプトで編集する際の方法

※ $gameVariablesの処理
 ●代入
  $gameVariables.setValue(1,3);    1番目の変数に3を代入
  $gameVariables.setValue(2,[0,1,2]);  2番目の変数に[0,1,2]を代入
   →いきなり$gameVariables.value(1) = 1;のような代入はできない
   ただし、配列を代入した後は、
   $gameVariables.value(1)[1] = 10; で再度代入できる

 ●呼び出し
  $gameVariables.value(1)
  $gameVariables.value(2)[1](配列の場合)



オブジェクトの中身を変数で呼び出す方法

●オブジェクトの中身(プロパティ)は「オブジェクト名.中身の名前」で呼び出すが、この時、「中身の名前」を変数で指定できる。
 変数にオブジェクトの中身の名前を文字列で代入したのち、「 [ ] 」の中に入れて呼び出す。
 この時、「 . 」はつけないので注意

 var tValue = tTestObject[中身の名前(文字列または文字列を代入した変数)];


●「数値と文字列を組み合わせる際の方法」と組み合わせれば、数字IDを使って呼び出すこともできる。

 var tTestObject = {prop1:100, prop2:"test", prop3:300};

 var tText2 = "prop2";

 var tBaseText = "prop";
 var tID = 3;
 var tText3 = tBaseText + tID; // 「prop」+「3」で「prop3」になる

 console.log("prop1の値", tTestObject.prop1 ); // tTestObjectの中身「prop1」を表示
 console.log("prop2の値", tTestObject[tText2] ); // 文字列で呼ぶときは「
[ ] 」に入れる
 console.log("prop3の値", tTestObject[tText3] ); // 「
. 」はつけない

 →表示結果:
  prop1の値 100
  prop2の値 test
  prop3の値 300



変数「$gameVariables」に小数を代入する方法

●イベントコマンドで使用する変数「$gameVariables」は、小数を直接代入しようとしても、小数点以下が切り捨てられてしまう
 例:
  $gameVariables.setValue(1, 0.2);
  $gameVariables.setValue(1, 1.5);

  console.log($gameVariables.value(1), $gameVariable.value(2));

  → 0, 1

●このため、$gameVariablesに小数を代入するには、配列にして代入し、呼び出すときは配列の要素として呼び出す必要がある。
 例:
  $gameVariables.setValue(1, [0.2]);
  $gameVariables.setValue(1, [1.5]);

  console.log($gameVariables.value(1)[0], $gameVariable.value(2)[0]);

  → 0.2, 1.5



フォルダ内の全ファイル名を配列で取得する方法

● 以下の方法で、フォルダに入っている全てのファイルについて、「ファイル名.拡張子」の文字列を配列で取得できる。

 const fs = require('fs');
 const tPath = "audio/bgm" // ここでは音楽フォルダを指定
 const tFileList = fs.readdirSync(tPath);

 console.log(tFileList);

 → ["ファイル1名前.ogg", "ファイル2名前.ogg", …];

● 「配列の長さ = 配列の要素数」なので、長さを取得すればフォルダ内のファイル数も取得できる。

 var tFileNum = tFileList.length;




ループ付きMIDIをループ付きOGGに変換する手順

●ツクールVX以前に使用できたループ付きMIDIをOGGに変換し、ループタグの追加・空白の削除等を行う際の手順をまとめたもの
●使用しているソフトは管理人が使用しているソフトだが、同じ機能があれば何でもよい
●それぞれのソフトの使い方はいろいろなHPで紹介されているので、細部は略

1 MIDIの各イベント確認
 MIDI編集ソフト「世界樹」で対象となるMIDIを開き、イベントリストを表示させて以下のイベントの位置を時間で確認
○ コントロールチェンジ111番(「cc:111」)【1】
○ 一番最後まで演奏しているトラックの「エンドオブトラック」【2】
○ 一番最初に演奏を開始するトラックの演奏開始点(一番最初の「ノートオン」)【3】

2 MIDIをOGGに変換
 音声編集ソフト「WavePad」でOGGに変換

3 OGGファイルにループタグ挿入
 音声編集ソフト「Audacity」でOGGを開き、メタデータを編集してループタグを追加
 ※現バージョンのWindowsで使われているIMEのバージョンでは、「Audacity」はフリーズしてしまう。
  このため、IMEを「以前のバージョンを使う」ようWindowsの設定を変えることが必要
  (説明は他のHPで書かれているので省略)

○ 左下の範囲を「選択範囲の開始点と終了点」にし、表示形式を「時間」表示になるよう設定
○ 開始点に【1】(cc:111)の時間を入力
○ 終了点に【2】(エンドオブトラック)の時間を入力
○ 左下の範囲を「選択範囲の開始点の長さ」に変更し、表示形式を「サンプル」に変更
○ それぞれのサンプルの値を記録
 ・ 「選択範囲の開始点」がループ開始点【4】に該当
 ・ 「選択範囲の長さ」がループする区間の長さ【5】に該当
○ 演奏開始点も同様にしてサンプルの値を取得
○ 演奏開始までの空白部分は後で削除するので、ループ開始点を削除後の値に変更
 具体的には、【4】(ループ開始点)から【3】(演奏開始点)の値を引き、その値を「新しいループ開始点」【6】に設定
○ 「編集」→「メタデータ」を選択し、以下のループタグを追加
 ・ 「LOOPSTART」を追加し【6】の値を設定
 ・ 「LOOPLENGTH」を追加し【5】の値を設定

4 OGGファイルの演奏開始までの空白部分を削除
 3に引き続き「Audacity」で編集
○ 左下の範囲を「選択範囲の開始点と終了点」にし、表示形式を「時間」表示になるよう設定
○ 選択範囲の開始点を「0」に設定
○ 選択範囲の終了点を【3】(演奏開始点)に設定
○ 「編集」→「削除」で選択部分(空白部分)を削除

5 編集後のOGGファイル書き出し
 4に引き続き「Audacity」で編集
 「ファイル」→「書き出し」→「OGGとして書き出し」



戻る