【解決済み】途中からの出現の不具合。

アバター
萎びれた猫
記事: 11
登録日時: 2021年5月17日(月) 02:26

【解決済み】途中からの出現の不具合。

投稿記事by 萎びれた猫 » 2022年7月27日(水) 01:13

お世話になっております。
以下のプラグインを使用させていただいております

オオホタルサイコ 様
EnemyAnimation.js
https://github.com/oHotaruPsycho/EnemyAnimation
https://ohotarupsycho.hatenablog.com/entry/2016/11/17/232432

エネミーのグラフィックをフレーム毎に表示、簡易アニメーションさせるプラグインなのですが
こちらを使用した際にバトルイベントでエネミーの途中からの出現を設定したところ
出現予定のエネミーが予め表示されてしまうことが分かりました(攻撃などの対象にはできない、表示されているだけ)。

調べたところスクリプト内でコメントアウトされている//this.initVisibility();が原因らしく、コメントアウトを外すと途中出現の挙動は正常になるのですが、今度はエネミーの消滅時のエフェクトがおかしくなってしまいました……(ボス、非ボス問わずHPが0になった瞬間一瞬で消えてしまう)。

こちらについて何か有識者の方からご意見がいただけないでしょうか……
どうかよろしくおねがいします。


※テストプロジェクトです、ご参考ください。
https://firestorage.jp/download/eee9f02febdbe2c22bd5beb9c9ddf53f4e2b2ed2
最後に編集したユーザー 萎びれた猫 on 2022年7月27日(水) 22:05 [ 編集 1 回目 ]

アバター
Plasma Dark
記事: 669
登録日時: 2020年2月08日(土) 02:29
連絡を取る:

Re: 途中からの出現の不具合。

投稿記事by Plasma Dark » 2022年7月27日(水) 03:07

Sprite_Enemy クラスの initVisibility メソッドでは、敵キャラの生存状態に応じて画像の表示非表示を切り替えています。
本来、この処理は画像の読み込みとともに、バトラーの名前または色調が変更された場合に一度だけ呼ばれます。

画像の読み込みについては、敵キャラの変身時にも呼ぶ必要があるのでこの処理は妥当な気はしますが、
可視状態の初期化までここでやる必要があるのかまでは読み切れてません。

雑にやるなら初期化済みかどうかのフラグを持たせて分岐してあげるのが楽でしょうか。
画像読み込み処理ではあるものの、アニメーションの更新とは意味が違うものなのでそもそも同じ処理を使い回すべきでないとは思います。
アバター
萎びれた猫
記事: 11
登録日時: 2021年5月17日(月) 02:26

Re: 途中からの出現の不具合。

投稿記事by 萎びれた猫 » 2022年7月27日(水) 22:03

Plasma Dark様、ご回答ありがとうございます!
お返事が遅れてしまい申し訳ありません!

Sprite_Enemy クラスの initVisibility メソッドでは、敵キャラの生存状態に応じて画像の表示非表示を切り替えています。
本来、この処理は画像の読み込みとともに、バトラーの名前または色調が変更された場合に一度だけ呼ばれます。

画像の読み込みについては、敵キャラの変身時にも呼ぶ必要があるのでこの処理は妥当な気はしますが、
可視状態の初期化までここでやる必要があるのかまでは読み切れてません。

エネミーが表示されてしまうのは本来のinitVisibilityメソッドの処理後に件のコードによって初期の状態で再度読み込みが発生してしまうため、ということですかね……?

雑にやるなら初期化済みかどうかのフラグを持たせて分岐してあげるのが楽でしょうか。
画像読み込み処理ではあるものの、アニメーションの更新とは意味が違うものなのでそもそも同じ処理を使い回すべきでないとは思います。

わかりました、いただいたヒントをもとに少し調べてみようと思います
……恥ずかしながらどういった方針で模索すればいいのかもわからなかったので代替案まで提示してくださるのは本当に助かります

お返事いただきありがとうございました
一旦こちらは解決済みとさせていただきますね
アバター
Plasma Dark
記事: 669
登録日時: 2020年2月08日(土) 02:29
連絡を取る:

Re: 【解決済み】途中からの出現の不具合。

投稿記事by Plasma Dark » 2022年7月27日(水) 23:49

エネミーが表示されてしまうのは本来のinitVisibilityメソッドの処理後に件のコードによって初期の状態で再度読み込みが発生してしまうため、ということですかね……?


initVisibility メソッドの呼び出しをコメントアウトすると、途中から出現であるはずの敵キャラが表示されてしまいます。
initVisibility 内で、対象の敵キャラが出現状態でない場合に姿を隠す(不透明度を0にする)という処理を行っているためです。

initVisibility は、 init(初期化) Visibility(可視性) の名の通り、その敵キャラが見えるかどうかを初期化する処理を行っているというわけです。

コアスクリプトでは敵キャラの名前が変わった場合(戦闘開始時 または 変身時)に呼ばれている処理でしたが、
EnemyAnimation.js ではコメントアウトして呼び出さなくしてしまっています。

このコメントアウトを外すと、今度はアニメーションする敵キャラに限って、 initVisibility が毎フレーム呼ばれてしまいます。

本来、撃破された敵キャラは updateEffect メソッドを毎フレーム呼び出すことによって
少しずつ不透明度を小さくして消えていきます。
(消滅エフェクトの残りフレーム数に応じた値を乗算しています)

しかし、initVisibility が毎フレーム呼ばれると、撃破されたことで出現状態でなくなった敵キャラは一瞬にして消えてしまいます。

initVisibility はメソッド名の通り、初期化処理です。
これを毎フレーム呼ばないようにするのは正しいことですが、さりとて全く呼ばないようにしてしまうとこれもまた歪みの元凶となります。

PRのひとつも送れればよかったのですが、今回問題になっている不具合以外にも直すべきところが多すぎたので、どうせならと互換性のあるプラグインを書いてみました。
https://github.com/elleonard/DarkPlasma ... imation.js
Rawボタンを右クリックして対象をファイルに保存してご利用ください。

こちらと、 EnemyAnimetion.js を差し替えてみてください。
ご利用のEnemyAnimetion.jsは古いバージョンのようで、 animation とすべきところを animetion とtypoしているので、
敵キャラのメモ欄だけスペルを修正する必要があります。

ハードコーディングされていたアニメーションの速さも、プラグインパラメータに切り出してあります。
アバター
萎びれた猫
記事: 11
登録日時: 2021年5月17日(月) 02:26

Re: 【解決済み】途中からの出現の不具合。

投稿記事by 萎びれた猫 » 2022年7月28日(木) 02:11

わああ!今しがた確認させていただきました!
お題の部分、その他動作ともに問題ないようです!本当にありがとうございます!

しかも、フレームのスピードが個別に設定できるようになっているだなんて嬉しすぎる……!

initVisibility メソッドの呼び出しをコメントアウトすると、途中から出現であるはずの敵キャラが表示されてしまいます。
initVisibility 内で、対象の敵キャラが出現状態でない場合に姿を隠す(不透明度を0にする)という処理を行っているためです。

initVisibility は、 init(初期化) Visibility(可視性) の名の通り、その敵キャラが見えるかどうかを初期化する処理を行っているというわけです。

コアスクリプトでは敵キャラの名前が変わった場合(戦闘開始時 または 変身時)に呼ばれている処理でしたが、
EnemyAnimation.js ではコメントアウトして呼び出さなくしてしまっています。

このコメントアウトを外すと、今度はアニメーションする敵キャラに限って、 initVisibility が毎フレーム呼ばれてしまいます。

本来、撃破された敵キャラは updateEffect メソッドを毎フレーム呼び出すことによって
少しずつ不透明度を小さくして消えていきます。
(消滅エフェクトの残りフレーム数に応じた値を乗算しています)

しかし、initVisibility が毎フレーム呼ばれると、撃破されたことで出現状態でなくなった敵キャラは一瞬にして消えてしまいます。

initVisibility はメソッド名の通り、初期化処理です。
これを毎フレーム呼ばないようにするのは正しいことですが、さりとて全く呼ばないようにしてしまうとこれもまた歪みの元凶となります。

上記の説明を聞いて、また、新しく頂いたスクリプトの内容もチラッと見て思ったのですが、
今回私の方で正解を導き出すのは難しかったと感じました……
本当の意味で解決済みとなりましたが、もう少し勉強してみようと思います……


Plasma Dark様、改めて本当にありがとうございました
互換元スクリプト製作者のオオホタルサイコ様にもこの場を借りてお礼申し上げたいと思います

“MV:質問” へ戻る