『RPGツクールMZ』の「アニメーションの表示」ではマップ上のイベントを対象に指定してアニメーションを再生する事ができます。
しかし筆者は基本的にツクールのマップイベントを使用しません。「ピクチャ」や「スプライト」を対象にアニメーションを再生したいのです!
というわけで、ツクールMZを購入してから一度も触った事が無かったアニメーションについて調べてみる事にしました。
途中、変なところでつまづいたから
コアスクリプトを手探りで辿るのが
めちゃくちゃしんどかった……
マップイベントを対象にしてアニメーションを再生するには?
まずは前提知識として、イベントコマンド「アニメーションの表示」と同様の事をスクリプトから実行してみましょう。
イベントコマンドの「スクリプト」に以下のコードを打ち込むと、マップイベントを対象にしてアニメーションを再生できます。
$gameTemp.requestAnimation([this.character(イベントID)],アニメーションID,反転するかどうか);
それぞれの引数(日本語の部分)は以下のように入力します。
- イベントID:マップイベントのID(数値)。プレイヤーは「-1」。
- アニメーションID:アニメーションデータベースのID(数値)
- 反転するかどうか:「true」で反転したアニメーションを表示。省略可能。
これで、マップ上のイベントを対象にしたアニメーションの再生ができました。簡単ですね。
任意の座標にアニメーションを表示する
では、いよいよ任意の座標にアニメーションを表示していきます。
サンプルとして、以下のような関数を定義してみました。
/**エフェクトを再生する
* @param {number} animationID アニメーションID
* @param {number} x X座標
* @param {number} y Y座標
* @param {boolean} mirror 反転
* @param {number} delay 遅延再生
*/
playEffect = function (animationID, x = 0, y = 0, mirror = false, delay = 0) {
// エフェクトの起点となるベーススプライトを生成して、シーンの子に登録する
const effectBaseSprite = new Sprite();
effectBaseSprite.move(x, y);
SceneManager._scene.addChild(effectBaseSprite);
// エフェクトスプライトを生成してセットアップし、シーンの子に登録する
const effectSprite = new Sprite_Animation();
effectSprite.setup([effectBaseSprite], $dataAnimations[animationID], mirror, delay, null);
SceneManager._scene.addChild(effectSprite);
};
座標をコントロールするために、起点となる空のスプライトを生成してアニメーションの対象にしています。
上記の関数を呼び出せば、任意の座標にアニメーションを表示できるはずです。
なお、上記サンプルではシーンに直接スプライトを登録していますが、ピクチャなど任意のスプライトに登録する事で、さらに座標やレイヤーのコントロールがしやすくなるでしょう。
上記サンプルはアニメーションの扱い方をかなりシンプルにまとめていますので、スクリプトを書き換えて自由に応用していただければと思います。
上記のサンプルコードには、アニメーション終了後にスプライトを破棄する処理などは含まれていませんので、必要な方は各自で実装をお願いします。
毎フレーム「effectSprite.isPlaying()」でアニメーションが再生中かどうかを判定して、「removeChild」や「destroy」すればOKです。
面倒ならプラグインの導入を検討
スクリプトを自作するのが面倒な場合は、「ツクマテ」で「トリアコンタン」さんがプラグインを公開されているようなので、そちらを利用するのも一つの手です。
筆者は利用していないのでプラグインの詳細は分かりませんが、おおむね同様の事はできるのではないでしょうか。