【完結】エネミーにステートを複数表示する方法

返信する
安曇野
記事: 8
登録日時: 2017年2月05日(日) 21:25

【完結】エネミーにステートを複数表示する方法

投稿記事 by 安曇野 »

今回は表題の通り、エネミーにステートを複数表示する方法について質問させてください。

まず、ステートの表示位置について変更を加えようと思ったのがきっかけです。
ステートの位置については、rpg_sprites.jsにある

コード: 全て選択

Sprite_Enemy.prototype.updateStateSprite = function() {
    this._stateIconSprite.y = -Math.round((this.bitmap.height + 40) * 0.9);
    if (this._stateIconSprite.y < 20 - this.y) {
        this._stateIconSprite.y = 20 - this.y;
    }
};
ここで xと yの値を変化させることで位置が変わると思いました。

コード: 全て選択

Sprite_Enemy.prototype.updateStateSprite = function() {
    this._stateIconSprite.x = 32;
    this._stateIconSprite.y = 0;
    }
};
とした事で、位置を変更する事に成功した(※アイコン位置1.jpg参照)のですが、皆様ご存じの通り、
エネミーはステートアイコンの表示数が1つに限られており、2つ以上のステートを表示する際はアイコンが切り替わることで対応しています。
これを、複数並べて表示(※アイコン位置2.jpg参照)するにはどこを改変すればいいのか、朝まで考えて分かったのは

コード: 全て選択

Sprite_StateIcon.prototype.updateIcon = function() {
    var icons = [];
    if (this._battler && this._battler.isAlive()) {
        icons = this._battler.allIcons();
    }
    if (icons.length > 0) {
        this._animationIndex ++;
        if (this._animationIndex >= icons.length) {
            this._animationIndex = 0;
        }
        this._iconIndex = icons[this._animationIndex];
    } else {
        this._animationIndex = 0;
        this._iconIndex = 0;
    }
};
ここでステートの数によってアニメーション(アイコンの切り替え表示)をするかしないかを判断しているということだけでした。
実際、this._animationIndexの値を増やせば、複数のステートが付加されても切り替わらなくなったのですが、ただ切り替わらなくなっただけで、表示される数は相変わらず一つでした。

私の脳みそではここが限界のようです。
エネミーのステートアイコンが複数の場合は並べて表示されるようにするには、あと何が足りないのでしょうか?
ご教授いただければ幸いです。

ちなみに、以前の記事でトリアコンタンさんがプラグインを提供されていたので、これを使わせていただこうとは思っていますが、
後学のためにも構造を知っておきたいので、ぜひともよろしくお願いします。



viewtopic.php?t=3226
添付ファイル
理想
理想
アイコン位置2.jpg (152.05 KiB) 閲覧された回数 2165 回
現実
現実
アイコン位置1.jpg (149.02 KiB) 閲覧された回数 2165 回
最後に編集したユーザー 安曇野 [ 2020年3月01日(日) 00:31 ], 累計 1 回
アバター
Plasma Dark
記事: 737
登録日時: 2020年2月08日(土) 02:29
連絡する:

Re: エネミーにステートを複数表示する方法

投稿記事 by Plasma Dark »

まず、jsとRPGツクールMVのコードを読むための知識や経験が足りていません。
コードを理解するための近道はそれこそ経験を積む以外にないのですが、いきなりRPGツクールMVのコアスクリプトを読もうとしても難しいので、機能がわかりやすく規模の小さい(100~200行くらいの)プラグインとコアスクリプトの処理を見比べるところから始めると良いかもしれません。

トリアコンタンさんの StateRingIcon.js を読めるようになれば、今回の件については全てがわかります。

これだけでは不親切なので、Sprite_StateIcon周りについてちょっと噛み砕いてみます。

Sprite_StateIconは表示されるステートアイコンを表しています。
ここまではなんとなくわかるかと思います。

_animationIndexは、アニメーション(=アイコンの切り替えアニメーション)を表現するためのもので、バトラー(エネミー)が付与されているステートアイコン一覧の中でのインデックスです。
_iconIndexは img/system/IconSet.png の中でどれを表示するかを表すインデックスです。

つまり、Sprite_StateIconの中にいる変数をちょっと操作したからと言って、表示される数が変わることはありません。

Spriteは1枚の画像を表す概念ですので、Sprite_StateIconが一つだけあっても表示できる数は一つだけです。
Sprite_Enemyの子要素であるSprite_StateIconを配列にして複数持てるようにするか、あるいはSprite_StateIconを親要素として子要素に実際のアイコンSpriteを配列で持たせるのが素直な実装方法かと思います。
StateRingIcon.jsは後者のアプローチで実装されているようです。


最後にお節介なことを一つだけ申し上げると、 rpg_***.js (いわゆる、RPGツクールMVのコアスクリプトと呼ばれるjsファイル群)を直接書き換えるべきではありません。
処理を試しに上書きする時でも、プラグインの形で行うほうが安全です。

※書き込み内に不適切な表現が混ざっていたため訂正しています。大変失礼しました。
安曇野
記事: 8
登録日時: 2017年2月05日(日) 21:25

Re: エネミーにステートを複数表示する方法

投稿記事 by 安曇野 »

Plasma Darkさん

いろいろと教えて下さり、ありがとうございました。
ヒントを元にもう少し考えたところ、実現するためにやるべきことはぼんやりと見えてきましたが、
おっしゃる通り知識も経験も無いので、では具体的にどうするか、というところまでたどり着けませんでした。

ここは黙って提供して下さったプラグインを使う事にいたします。
自作プラグインを再挑戦するのはまたの機会に。

今回は大変勉強になりました。
このトピックは、解決ではないですが完結としておこうと思います。

ありがとうございました。
返信する

“MV:質問”に戻る