【プラグイン】DotMoveSystemとPD_8DirDashを併用したい

アバター
BumbleB
記事: 15
登録日時: 2017年2月27日(月) 05:28

【プラグイン】DotMoveSystemとPD_8DirDashを併用したい

投稿記事by BumbleB » 2024年3月23日(土) 00:23

今作製しているゲームで、うなぎおおとろ氏のDotMoveSystemとしおいぬ氏のPD_8DirDashを両方導入して
「ドット単位移動と8方向移動+ダッシュ移動時の画像変更」ができるようにしたいと考えています。

DotMoveSystem 1733行目~

コード: 全て選択

        dotMoveByDeg(deg, dpf = this._character.distancePerFrame()) {
            if (this._moverData.stopping)
                this.resumeMove();
           // this.setDirection(deg.toDirection4(this._character.direction()));
           //ここを8方向に判定するように書き換える
            this.setDirection(deg.toDirection8(this._character.direction()));
            console.log(this._character);
            const moved = this.createDotMoveProcess().dotMoveByDeg(deg, dpf);
            this._character.moveCallback(moved, dpf);
        }

ドット単位で移動した時、DotMoveSystemは上下左右方向のキャラ画像だけがあることを想定しているので
そこを斜め向きかどうかまで判定するようにすればよいのではないかと思い、このように直してみたところ
一応歩き入力時に斜め方向の画像が適用されるようになりました。



●わからないところ
ただし以下の点が解決できなくて困っています。
①矢印キー入力で移動した時、ダッシュ入力してもダッシュ時の画像が反映されない
PD_8DirDash 60行目~

コード: 全て選択

    Sprite_Character.prototype.shiftCharacterPatternX = function(shift) {
        if(this._prevStopping){
            this._prevStopping = this._character.isStopping();
        }
        var fileName = this._characterName.substring(this._characterName.lastIndexOf( "_" ));
        if((fileName.indexOf("D") != -1) && this._character.isDashing() && !this._prevStopping){
            shift += 3;
        }
        this._prevStopping = this._character.isStopping();
        return this._character.pattern() + shift;
    };

この箇所の if((fileName.indexOf("D") != -1) && this._character.isDashing() && !this._prevStopping)
の条件の判定がDotMoveSystemを入れたときになにか変わっているのだと思うのですが、これ以上わかりませんでした。
②マウスで移動先を指定した時、斜め方向の画像が反映されない
マウスクリックで移動する場合は、逆にダッシュ画像が反映され、斜め移動の画像が反映されない、という状況です。

上記の2点について、粘ってみたのですが自力では難しい(特にDotMoveSystemが何をしているのかうまく理解できない)ので、解決法をご教授いただければと思います。よろしくお願いします。






●なぜこの2つのプラグインを使いたいか
・うなぎおおとろ氏のCharacterMoveMotionExを使えば、DotMoveSystemと同じことができるのではないか
→PD_8DirDashと木星ペンギン氏のMPP_CharacterMakeを併用して、「ゲーム中の見た目変更機能+8方向・ダッシュ移動画像の変更」をできるようにしたいと考えています。
CharacterMoveMotionExがプラグインパラメータでダッシュに使う画像、斜め移動に使う画像などを事前に指定しておくタイプのプラグインなので、
ゲーム中にキャラクター画像を生成する(という理解でよいのでしょうか…)MPP_CharacterMakeとは相性がよくないので、PD_8DirDashを使いたいと考えています。
・他の移動系プラグインで対応できないか
→当初サンシロ氏のSAN_AnalogMoveと併用していたのですが、当たり判定の調節やドット単位の移動が指定できるDotMoveSystemのほうが多機能なので、こちらに乗り換えたいと考えています。
トリアコンタン氏のHalfMoveも試してみたのですが、できればドット単位で移動できる方が動かしていて楽しいのでこちらを採用したいと考えています。

アバター
BumbleB
記事: 15
登録日時: 2017年2月27日(月) 05:28

Re: 【プラグイン】DotMoveSystemとPD_8DirDashを併用したい

投稿記事by BumbleB » 2024年4月18日(木) 22:06

ずっと色々いじっていたのですがどうしてもわからなくなってしまったのでもしアドバイスがいただけたら幸いです…
(もしかして質問ではなくてプラグインで聞くほうが良いのでしょうか?)

PD_8DirDash.jsの60行目~

コード: 全て選択

Sprite_Character.prototype.shiftCharacterPatternX = function(shift) {
    if(this._prevStopping){
        this._prevStopping = this._character.isStopping();
    }
    var fileName = this._characterName.substring(this._characterName.lastIndexOf( "_" ));
    if((fileName.indexOf("D") != -1) && this._character.isDashing() && !this._prevStopping){
    //!this._prevStoppingが方向キーで移動した時常にfalseになっている
        shift += 3;
    }
    this._prevStopping = this._character.isStopping();
    return this._character.pattern() + shift;
};


まずダッシュ時に専用のダッシュモーション画像に変更してる箇所なのですが、DotMoveSystemを入れている状態だとthis._character.isStopping()が常にfalseになってしまう(マウス移動だと普通に動く)ということがわかりました
じゃあthis._prevStoppingに入れるものを変えればよいのかなと思い、コンソールで確認して色々変えてみたのですがうまくいきませんでした
DotMoveSystemではどこでプレイヤー停止判定が行われているかが知りたいです


PD_8DirDash.jsの72行目~

コード: 全て選択

Sprite_Character.prototype.characterPatternY = function() {
        if(!this._prevDir){
            this._prevDir = 2;
        }
        var fileName = this._characterName.substring(this._characterName.lastIndexOf( "_" ));
        if((fileName.indexOf("Q") != -1) && (this._character.direction() % 2 != 0)){
            if(this._character.direction() < 5){
                return 4 + ((this._character.direction() - 1 ) / 2);
            } else {
                return 4 + ((this._character.direction() - 3 ) / 2);
            }
        }
        else{
            var i = 0;             
            if(this._character.direction() % 2 != 0){
              if(this.getAddX(this._prevDir) === this.getAddX(this._character.direction()) * -1){
                  this._prevDir = this.reverseDirection(this._prevDir);
              } else if(this.getAddY(this._prevDir) === this.getAddY(this._character.direction()) * -1){
                  this._prevDir = this.reverseDirection(this._prevDir);
              }
              return (this._prevDir + i - 2) / 2;
            }
            this._prevDir = this._character.direction();
            return (this._character.direction() + i - 2) / 2;
        }
    };

こちらが斜め方向の画像を反映させている箇所だと思うのですがGame_CharacterBase.prototype.moveDiagonallyの処理を書き換えて8方向の判定をしている?と思うのですが
DotMoveSystemでは専用のドット移動処理をするので、そもそもGame_CharacterBase.prototype.moveDiagonallyが呼ばれない?ようでした
そしてDotMoveSystemではプレイヤーの向きは4方向に直される(斜め向きの画像は考慮されてない)ので
どうやっても8方向画像が反映されないということなのかなと思います
じゃあDotMoveSystem側で向き(direction)を拡張すればよいのかなと思ったのですが

DotMoveSystem706行目

コード: 全て選択

    static direction2Axis(direction4) {
        if (direction4 === 4 || direction4 === 6) {
            return "x";
        }
        else if (direction4 === 8 || direction4 === 2) {
            return "y";
        }
        else {
            throw new Error(`${direction4} is not found`);
            //ここにひっかかってる
        }
}

ここでエラーが出てしまうという問題にあたってしまいました。この箇所は障害物にぶつかったりした時どの方向にキャラをずらすかといった判定をしているんだと思うのですが、勝手にdirection4となっている箇所をdirection8とかにしてしまうとエラーになってしまうということですよね。
それ以上はよく理解できませんでした……
DotMoveSystemではキャラの向きがどこで判定されているか知りたいです

理解不足で意味不明な質問になっている箇所も多いと思いますが、大目に見ていただけると幸いです…
アバター
WTR
記事: 559
登録日時: 2015年12月22日(火) 19:14

Re: 【プラグイン】DotMoveSystemとPD_8DirDashを併用したい

投稿記事by WTR » 2024年4月20日(土) 16:38

ちょっと見てみたのですけど完全に手に負えない代物でした…
が、それだけじゃアレなので一応調べたことを共有します。
まずダッシュ時に専用のダッシュモーション画像に変更してる箇所なのですが、DotMoveSystemを入れている状態だとthis._character.isStopping()が常にfalseになってしまう(マウス移動だと普通に動く)ということがわかりました

これは逆じゃないでしょうか。常時 true になっている気がします。
なんでなんだという話ですが DotMoveSystem のほうの

コード: 全て選択

    const _Game_CharacterBase_update = Game_CharacterBase.prototype.update;
    Game_CharacterBase.prototype.update = function () {
        this.clearMovedFlagIfRequested();
        _Game_CharacterBase_update.call(this);
        this.updateMapCharactersCache();
        this.updatePostMove();
    };

update 内で呼ばれる updatePostMove

コード: 全て選択

    Game_CharacterBase.prototype.updatePostMove = function () {
        if (!this.isMoving())
            return;
        if (!this.mover().isMovingToTarget()) {
            this._moving = false;
            if (this._setThroughReserve != null) {
                this._through = this._setThroughReserve;
                this._setThroughReserve = undefined;
            }
            if (this._setMoveSpeedReserve != null) {
                this._moveSpeed = this._setMoveSpeedReserve;
                this._setMoveSpeedReserve = undefined;
            }
            this.refreshBushDepth();
        }
    };

キーボード入力での移動では this.mover().isMovingToTarget() は false を返すっぽくて
this._moving = false にされて常時移動していないとの判定になっているようです。

ならば updatePostMove の前にスプライトを更新すればダッシュ画像が反映されるのでは?という発想で

コード: 全て選択

    const _Game_CharacterBase_update = Game_CharacterBase.prototype.update;
    Game_CharacterBase.prototype.update = function () {
        // キャラクタースプライトを強引に割り出して更新する
        const sprite = SceneManager._scene._spriteset._characterSprites.filter(sprite => sprite._character === this)[0];
        if (sprite) {
            sprite.updateCharacterFrame();
        }
        this.clearMovedFlagIfRequested();
        _Game_CharacterBase_update.call(this);
        this.updateMapCharactersCache();
        this.updatePostMove();
    };

としたところ、プレイヤーに関してはダッシュ画像が反映されました。
ただフォロワーは別の原理が働くようでダメでした…

Game_CharacterBase.prototype.moveDiagonally に関しては2つのプラグインがそれぞれ上書きしてるので
どっちを上に配置するかで挙動が変わるはず。
身も蓋もない話ですが同時に使うには危険な組み合わせな気がしますね。
Twitter、はじめました。
https://twitter.com/wtr_in_reverie/
アバター
BumbleB
記事: 15
登録日時: 2017年2月27日(月) 05:28

Re: 【プラグイン】DotMoveSystemとPD_8DirDashを併用したい

投稿記事by BumbleB » 2024年4月21日(日) 22:26

ありがとうございます!
やっぱりかなり複雑ですよね…まあアローキーでの移動、マウスでの移動、イベントコマンドからの移動、フォロワーの移動と、移動といっても色々あるからこうなるのはわかるんですが…

これは逆じゃないでしょうか。常時 true になっている気がします。

おっしゃるとおりでした。PD_8DirDash.jsのSprite_Character.prototype.shiftCharacterPatternXは
!this._prevStoppingを判定しているんですね。!を見落としていました。

プレイヤーに関してはダッシュ画像が反映されました。
ただフォロワーは別の原理が働くようでダメでした…

ありがとうございます!ダッシュ画像のところは正直お手上げだったので解決していただき助かりました。
それからフォロワーの部分なのですが、どうもPD_8DirDash.jsはそもそもフォロワーのダッシュ/斜め画像変更に
対応していない?気がします。もうちょっと調査します。
アバター
BumbleB
記事: 15
登録日時: 2017年2月27日(月) 05:28

Re: 【プラグイン】DotMoveSystemとPD_8DirDashを併用したい

投稿記事by BumbleB » 2024年4月21日(日) 23:02

その他調査したことについて

①PD_8DirDash.js側の以下の処理をコメントアウトしておく
Game_Map.prototype.xWithDirection
Game_Map.prototype.yWithDirection
Game_Map.prototype.roundXWithDirection
Game_Map.prototype.roundYWithDirection
Game_CharacterBase.prototype.moveDiagonally
Game_Character.prototype.findDirectionTo
Game_Map.prototype.isPassable
多分コメントアウトしなくて良いものも混じっている気がしますが、少なくとも上4つは必須のようです
マウスで移動先を指定した時、東西南北の四方向の移動がおかしくなる(ジグザグ移動になってしまう)
読み込み順はdotMoveSystemが上のほうがよい気がするのですが…どうなんでしょう


②斜め移動の反映について
無理やり8方向の向き判定にするとエラーになるなら、画像変更専用の向き判定を作ればいいのではと思い実験
dotMoveSystem1647行目~

コード: 全て選択

        initialize(character) {
            this._character = character;
            this._moverData = character.moverData();
            this._character._deg8 = this._character._direction;
            //マップに入った時キャラが表示されていない状態になるので
        }

1734行目~

コード: 全て選択

        dotMoveByDeg(deg, dpf = this._character.distancePerFrame()) {
            if (this._moverData.stopping)
                this.resumeMove();
            this._character._deg8 = deg.toDirection8();//8方向の仮判定を追加
            this.setDirection(deg.toDirection4(this._character.direction()));
            const moved = this.createDotMoveProcess().dotMoveByDeg(deg, dpf);
            this._character.moveCallback(moved, dpf);
        }

1781行目~

コード: 全て選択

       
         moveToTarget(targetPoint) {
            const fromPoint = this._character.positionPoint();
            const deg = fromPoint.calcDeg(targetPoint);
            this._character._deg8 = deg.toDirection8();//8方向の仮判定を追加
            const dir = deg.toDirection4(this._character.direction());
            this.setDirection(dir);
            const targetFar = fromPoint.calcFar(targetPoint);
            this.startContinuousMove(targetFar, deg);
        }


PD_8DirDash

コード: 全て選択

    Sprite_Character.prototype.characterPatternY = function() {
        if(!this._prevDir){
            this._prevDir = 2;
        }
        var fileName = this._characterName.substring(this._characterName.lastIndexOf( "_" ));
        if((fileName.indexOf("Q") != -1) && (this._character._deg8 % 2 != 0)){
            if(this._character._deg8 < 5){
                return 4 + ((this._character._deg8 - 1 ) / 2);
            } else {
                return 4 + ((this._character._deg8 - 3 ) / 2);
            }
        }
        else{//以下略。this._character.direction()となっている箇所をthis._character._deg8に代えただけ


これでとりあえずアローキーでの移動時には斜め向き画像がきちんと反映されるようになりました。
ただしマウスで移動したときに
「斜め向きの場合のみ、目的地につくまで向きを変えずに移動し(歩行アニメは適用される)、目的地についたときに向きを変更する」というよくわからない現象が起こります。ムーンウォークみたいな。
そしてフォロワーはきちんと移動方向への斜め向き画像が反映されます…なんでだ
多分フォロワーはプレイヤーの方向を向くように処理されていることが関係しているんだと思いますが、もう少し調べないとよくわからないですね…

どうやらdotMoveSystemを入れているときGame_CharacterBase.prototype.moveDiagonallyは
イベントコマンドで斜め方向移動を指定した時以外は呼ばれなくなり、CharacterMover.dotMoveByDegでドット移動を行っているように思われます。

中途半端で申し訳ないですが、もう少し調査してまた投稿したいと思います。ありがとうございます。
アバター
BumbleB
記事: 15
登録日時: 2017年2月27日(月) 05:28

Re: 【プラグイン】DotMoveSystemとPD_8DirDashを併用したい

投稿記事by BumbleB » 2024年4月22日(月) 03:12

とりあえずできたところまでプラグイン化してみました。
一応8方向ダッシュ画像のサンプルも添付していますので合わせてご利用ください。
通常の移動、マウスでの移動、イベントコマンドからの移動は一応大丈夫な気がするのですが
まだ未知の問題がたくさんあると思います。とりあえず乗り物関係は壊滅状態……

プログラミングはほんとに初心者なので、もしもっとこうした方がいい、などあればご指導いただけると助かります
添付ファイル
PF_DotMoveSystem8DirDashPlus.js
(6.18 KiB) ダウンロード数: 3 回
Male_QD.png

“MV:質問” へ戻る