ページ 11

【解決済み】特定のステートがついた敵を透明にするスクリプトにおける透明化解除のタイミングについて

Posted: 2021年2月14日(日) 22:15
by ドラムカン
いつもお世話になります。

以下のツクマテページに、
特定のステートがついた敵を透明にするプラグインが紹介されているのですが、
viewtopic.php?t=8710

そのステートが解除されたタイミングで透明化も解除されるかと思いきや
次のターンに敵が攻撃するまで透明化が解除されませんでした。

そこで、
透明化の解除を、ステート解除のタイミングと合わせようと
以下のようにelseを追加しました。

コード: 全て選択

var _updateEffect = Sprite_Enemy.prototype.updateEffect;
Sprite_Enemy.prototype.updateEffect = function() {
    if(this._enemy.isStateAffected(57)){//「透明化」ステートがついている場合は不透明度を下げる
        this.opacity = 0;
    }else{
        this.opacity = 255;
    }
    _updateEffect.call(this);
};

var _Sprite_StateIcon_updateTransform = Sprite_StateIcon.prototype.updateTransform;
Sprite_StateIcon.prototype.updateTransform = function updateTransform() {
    _Sprite_StateIcon_updateTransform.apply(this, arguments);
    this.worldAlpha = this.alpha;
};
ところが、ステートID57がFalseのとき、常にthis.opacity = 255;の処理を通るため、
エネミーを倒したあと、消滅エフェクトは作動するのですが
消滅エフェクトのままエネミー画像が消えなくなってしまいました。

倒したエネミーがきちんと消えるように
戦闘不能ステートがtrueのとき、this.opacity = 0;とする以下の条件式を入れました。

コード: 全て選択

var _updateEffect = Sprite_Enemy.prototype.updateEffect;
Sprite_Enemy.prototype.updateEffect = function() {
    if(this._enemy.isStateAffected(57)){//「透明化」ステートがついている場合は不透明度を下げる
        this.opacity = 0;
    }else{
        if(this._enemy.isStateAffected(1)){
             this.opacity = 0;
	}else{
	     this.opacity = 255;
        }
    }
    _updateEffect.call(this);
};
しかしこれだと、消滅エフェクトが端折られて
一瞬でエネミーが消えてしまいます。

そもそもこの方法が正しいのかの判断が付きません。
良い方法がありましたら、一案をいただけますと幸いです。

どうかよろしくお願いいたします。

Re: 特定のステートがついた敵を透明にするスクリプトにおける透明化解除のタイミングについて

Posted: 2021年2月15日(月) 01:19
by トリアコンタン
こんにちは!
戦闘不能時の透明化エフェクトはコアスクリプトが実行してくれるので、
「生存している場合」だけの処理があればいいと思います。
そのフラグは「_appeared」という変数に定義されています。

修正例

コード: 全て選択

var _updateEffect = Sprite_Enemy.prototype.updateEffect;
Sprite_Enemy.prototype.updateEffect = function() {
    if (this._enemy.isStateAffected(1)){//「透明化」ステートがついている場合は不透明度を下げる
        this.opacity = 64;
    } else if (this._appeared) {
        this.opacity = 255;
    }
    _updateEffect.call(this);
};

Re: 特定のステートがついた敵を透明にするスクリプトにおける透明化解除のタイミングについて

Posted: 2021年2月15日(月) 01:48
by ドラムカン
トリアコンタン様

いつもいつも本当にお世話になります。

おかげさまで、消滅エフェクトに影響を与えず、求めていた挙動を実現できました。
最良の解決策をくださり、心から感謝申し上げます。

なるほど、
戦闘不能時の処理が、コアスクリプトの「rpg_sprites.js」で管理されているというところまでは分かったのですが
それとは別に、生存判定フラグなるものがあったのですね。
大変、勉強になりました。

これからも、どうかよろしくお願いいたします。

Re: 【解決済み】特定のステートがついた敵を透明にするスクリプトにおける透明化解除のタイミングについて

Posted: 2021年2月15日(月) 15:59
by ドラムカン
トリアコンタン様

解決済みの後に失礼いたします。

本件の目的は、
「地中に隠れるエネミー」のスキルを作成するものでして、
そのために、エネミーの表示/非表示についてご質問させていただきました。

もしも可能であれば、なのですが
隠れる、または現れる際、エネミーにエフェクトを付けることは可能でしょうか。

デフォルトの機能にあります「ボスの消滅エフェクト」が、
地中に潜るアニメーションそのままとなっておりますので
以下のコードで速度を上げて描画すれば、消滅エフェクトではなく
土に潜っているように見えるのではないかと淡い期待を抱いております。

コード: 全て選択

(function(){
const _Sprite_Enemy_updateBossCollapse = Sprite_Enemy.prototype.updateBossCollapse
  Sprite_Enemy.prototype.updateBossCollapse = function() {
    this._effectDuration -= this._effectDuration > 1 ? 3 : 0
    _Sprite_Enemy_updateBossCollapse.call(this)
};
})();
(※このコードはあくまで消滅エフェクトに対してのものですので関連性がないかもしれません)

「隠れる」スキルの内部処理は、デフォルトの機能(回避率や狙われ率等の調整)で実装できたのですが
それを描画するための機能やプラグインが存在しないため
今回の表示/非表示ステートに付与できない物かと考えております。

難しいようでしたらスルーしてくださって構いませんので
何か一案がありましたら、頂戴できますと幸いです。

どうかよろしくお願いいたします。

Re: 【解決済み後、追記】特定のステートがついた敵を透明にするスクリプトにおける透明化解除のタイミングについて

Posted: 2021年2月16日(火) 01:39
by トリアコンタン
こんにちは!

ボス用の消滅エフェクトに少し手を加えれば、エフェクトだけはそれっぽい挙動にはできますが、
もともと消滅用に作られたものなので、そのまま流用しようとすると様々な不整合がでます。
(消滅効果音が出続けたり、合成方法が加算になったり、元に戻せなかったり)

既にリクエストされている通り、消滅エフェクトの実装を参考にして、専用プラグインを作成するのが結局は一番の近道だと思います。

Re: 【解決済み後、追記】特定のステートがついた敵を透明にするスクリプトにおける透明化解除のタイミングについて

Posted: 2021年2月16日(火) 02:58
by ドラムカン
トリアコンタン様

ご回答いただき、ありがとうございます。

やはり消滅エフェクトを流用するのは様々な問題があるのですね。
描画部分の処理を参考にプラグインを作成してみようと思います。

貴重な情報をくださり、誠にありがとうございました。