解決)キャラチップのファイル名でマップ上でのY軸表示変更

アバター
こめかみ
記事: 104
登録日時: 2017年9月06日(水) 19:34
連絡を取る:

Re: キャラチップのファイル名でマップ上でのY軸表示変更

投稿記事by こめかみ » 2022年1月27日(木) 16:34

なぴぃ様
恐れ入ります。

コード: 全て選択

Game_CharacterBase.prototype.shiftY = function() {
    return this.isObjectCharacter() ? 0 : 0; // ←ズレを視認しやすくするため6を0にしています
};

確認したところshiftYは昨日の変更後のものではなく、気づかず変更を戻してしまっていたデフォルトの上記でした。なので添付した画像はデフォルトで試行したものでした。

新規プロジェクトで他にプラグインはCommunity_BasicとMadeWithMvのみ
あとはrpg_objectsの

コード: 全て選択

Game_CharacterBase.prototype.setImage = function(characterName, characterIndex) {
this._tileId = 0;
this._characterName = characterName;
this._characterIndex = characterIndex;
this._isObjectCharacter = ImageManager.isObjectCharacter(characterName);
//↓追加分
const match = characterName.match(/\(v(\d{1,4})\)/); //正規表現でマッチしたパターンを配列に格納
if(match){ //マッチした場合は配列が入るのでtrue、マッチしなかった場合はnullが入るのでfalse
this.offsetShiftY = 0 - Number(match[1]); //キャプチャーグループ内の数字の文字列を数値化し0からマイナスした値を格納する。
};
};


rpg_spritesの208行目あたり

コード: 全て選択

Sprite_Character.prototype.setCharacter = function(character) {
this._character = character;
//↓追加分
const y=1+this._character.offsetShiftY/$gameMap.tileHeight();
if(this._character.offsetShiftY){this._anchor._y=y};
};


上記を変更いたしました。
画像サイズとしては茶色忍者144*144(全体576*432) 紫忍者240*240(全体960*720)のものを使用しました。
ズレ方が二次関数のようになるのはこちらの設定方法のミスかも知れません再度見直してみます。
ただ、サイズを変えてみて気づいたのですがキャラの画像サイズによって_anchorで1変えた時に動く量が変わるようです。
_anchor=1で元の位置。そこから1変更するとキャラクターのサイズ分ずれる仕様のようです。

(v)の数値をタイルのサイズで割っていたのですが、画像サイズで割らないと正しいピクセル数ずれないかもしれません。
しかしこの処理の時点ではキャラクターのサイズが取得できません。
もう一工夫必要かもしれません。
後ほど修正するので少々お待ち頂けないでしょうか。


大変お手数お掛けいたします。ありがとうございます。

アバター
なぴぃ
記事: 41
登録日時: 2021年12月19日(日) 19:47
連絡を取る:

Re: キャラチップのファイル名でマップ上でのY軸表示変更

投稿記事by なぴぃ » 2022年1月27日(木) 23:54

お待たせしました。うまく処理を行う方法が見つかりましたので共有します。

Game_CharacterBase.prototype.setImage に加えた変更はそのままです。
それ以外の処理は元に戻して下さい。

そして Sprite_Character.prototype.updateCharacterFrame に処理を追加します。

コード: 全て選択

Sprite_Character.prototype.updateCharacterFrame = function() {
    var pw = this.patternWidth();
    var ph = this.patternHeight();
    var sx = (this.characterBlockX() + this.characterPatternX()) * pw;
    var sy = (this.characterBlockY() + this.characterPatternY()) * ph;
    this.updateHalfBodySprites();
    if (this._bushDepth > 0) {
        var d = this._bushDepth;
        this._upperBody.setFrame(sx, sy, pw, ph - d);
        this._lowerBody.setFrame(sx, sy + ph - d, pw, d);
        this.setFrame(sx, sy, 0, ph);
    } else {
        this.setFrame(sx, sy, pw, ph);
    }
    //↓追加分
    if(this._character.offsetShiftY){
        this._anchor._y=1+this._character.offsetShiftY/this.patternHeight();
    };
};

これで画像の高さが取得できた時に画像の高さで数値を割る事で常に入力したドット数だけずれるようになります。

確認したところshiftYは昨日の変更後のものではなく、気づかず変更を戻してしまっていたデフォルトの上記でした。なので添付した画像はデフォルトで試行したものでした。

改めて画像を見返してみたのですが、画像サイズの分大きくずれてただけで二次関数にはなっていませんね。
入力している値が12,24,48,96と二次関数的になっているので当然位置も二次関数的になっているだけのように思います。

実際v0からv48までの距離とv48からv96までの距離は等しくなっています。
ですので元々正しい状態になっていたのだと思います。


いろいろ変更を行いややこしい事になってしまった為プラグイン化してみました。
画像を下に動かすだけでなく上下左右自由にずらせてエフェクトの位置等も独立して操作できる機能強化版になっています。
イベントのメモ欄からも設定できます。
https://napiiey.github.io/plugins/napi_mapcharacteroffset.html

こちらを使う場合は今まで加えたコアスクリプトの変更を元に戻してから導入して下さい。
機能強化に伴いファイル名の記述方法等も変わっている為ご注意下さい。
なぴぃ
Twitter: https://twitter.com/napiiey
プラグイン置き場: https://napiiey.github.io/plugins/
animestorm5
記事: 4
登録日時: 2022年1月28日(金) 07:06

Re: キャラチップのファイル名でマップ上でのY軸表示変更

投稿記事by animestorm5 » 2022年1月28日(金) 07:15

こめかみ さんが書きました:なびぃ様
おっしゃる通りでイベント元位置のプライオリティを比較して表示したいです。
アクションRPGを作成しているのですが、添付したサンプル画像のように(下から踏みつけるとおかしい画像には適用せず)足元より下に武器などを振り回すといったキャラチップに対してY軸の調整を行う目的でした。

現在 "MOG_CharPoses.js"による"(y〇〇)で上下させる"という提案した方法と同じプラグインを使用していたのですが、その際の"下キャラの頭部が上キャラの足元にめり込む"のが気になり、どうにかならないかと質問させて頂きました。
現状、すべてのキャラクター画像を48px上げて作成し、上記のプラグインで48px下げて重なりの違和感を回避していたのですが、それよりも大きい画像を使用する際に(現在は192pxで収まっていますが)、その都度それに合わせて全ての画像を調整し直すのは現実的ではないなという事情でした。

自分なりにいじっていて、アニメーションやプライオリティでのspriteの下端の起点はどこか知らない奥にある仕様の気がしていたのですが、やはりここを変えるのは難しそうなのですね。
アニメーションのちらつきはPCの処理速度が悪く安定していなかったようです、失礼いたしました。
別の手段を考えてみようと思います。ご教授頂きありがとうございます。

くろうどさんもおっしゃっていましたが、何を実現する為の処理なのかがわからない為どうなれば正解なのかという明確なビジョンが共有できていなかったかもしれません。
添付画像を見てみましてもプライオリティは画像に対して正しいプライオリティになっているように思います。
となるとプライオリティを画像の下端ではなくイベント位置に合わせたい(つまり赤い部分が足元)という事でしょうか?

Z座標に応じた描画の処理はツクールのコアスクリプトには定義されておらずpixi.jsの領域のようです。
pixi.jsに関しては詳しくないのですが、sprite単位で処理をしている為spriteの下端が起点になるのは仕様なんじゃないかと思います。
そもそも赤い部分が足元となるようにできた場合その他のイベントが1マス手前を通過するとイベントを踏みつけるような感じになるかと思いますがそれでよいのでしょうか?
(v)で調整したイベントがマップの小物の1マス上を通り抜ける場合も小物の下を通り抜けるようなおかしなことになるような気がしますが。
足元に設定したアニメーションがずれるのもアニメーションがイベントの座標ではなくSprite(画像やアニメーション)に合わせた正しい位置に表示されているという事なんじゃないかと思います。
これらも全て(v)で指定した分上にずらすとなると難易度がかなり上がってしまうように思います。
現状の私の理解ではすぐ対応する事が難しそうです。

アニメーション表示時のイベントのちらつきに関しましてはこちらで試しても発生しなかった為不明です。

何を実現したいかにもよりますが、他の手段を取った方がよさそうな気もします。


Keep it up the good work:)
animestorm5
記事: 4
登録日時: 2022年1月28日(金) 07:06

Re: キャラチップのファイル名でマップ上でのY軸表示変更

投稿記事by animestorm5 » 2022年1月28日(金) 07:16

こめかみ さんが書きました:なぴぃ様
恐れ入ります。

コード: 全て選択

Game_CharacterBase.prototype.shiftY = function() {
    return this.isObjectCharacter() ? 0 : 0; // ←ズレを視認しやすくするため6を0にしています
};

確認したところshiftYは昨日の変更後のものではなく、気づかず変更を戻してしまっていたデフォルトの上記でした。なので添付した画像はデフォルトで試行したものでした。

新規プロジェクトで他にプラグインはCommunity_BasicとMadeWithMvのみ
あとはrpg_objectsの

コード: 全て選択

Game_CharacterBase.prototype.setImage = function(characterName, characterIndex) {
this._tileId = 0;
this._characterName = characterName;
this._characterIndex = characterIndex;
this._isObjectCharacter = ImageManager.isObjectCharacter(characterName);
//↓追加分
const match = characterName.match(/\(v(\d{1,4})\)/); //正規表現でマッチしたパターンを配列に格納
if(match){ //マッチした場合は配列が入るのでtrue、マッチしなかった場合はnullが入るのでfalse
this.offsetShiftY = 0 - Number(match[1]); //キャプチャーグループ内の数字の文字列を数値化し0からマイナスした値を格納する。
};
};


rpg_spritesの208行目あたり

コード: 全て選択

Sprite_Character.prototype.setCharacter = function(character) {
this._character = character;
//↓追加分
const y=1+this._character.offsetShiftY/$gameMap.tileHeight();
if(this._character.offsetShiftY){this._anchor._y=y};
};


上記を変更いたしました。
画像サイズとしては茶色忍者144*144(全体576*432) 紫忍者240*240(全体960*720)のものを使用しました。
ズレ方が二次関数のようになるのはこちらの設定方法のミスかも知れません再度見直してみます。
ただ、サイズを変えてみて気づいたのですがキャラの画像サイズによって_anchorで1変えた時に動く量が変わるようです。
_anchor=1で元の位置。そこから1変更するとキャラクターのサイズ分ずれる仕様のようです。

(v)の数値をタイルのサイズで割っていたのですが、画像サイズで割らないと正しいピクセル数ずれないかもしれません。
しかしこの処理の時点ではキャラクターのサイズが取得できません。
もう一工夫必要かもしれません。
後ほど修正するので少々お待ち頂けないでしょうか。


大変お手数お掛けいたします。ありがとうございます。


Amazing info :)
animestorm5
記事: 4
登録日時: 2022年1月28日(金) 07:06

Re: キャラチップのファイル名でマップ上でのY軸表示変更

投稿記事by animestorm5 » 2022年1月28日(金) 07:18

なぴぃ さんが書きました:

コード: 全て選択

ただ(v)に入れる数値でズレ方が二次関数?のようになるのですが、これはどういった計算になっているのでしょうか??重ねての質問すみません。

こちらで確認した限りでは画像のサイズ等を変えてみても二次関数のようなずれ方は確認できませんでした。
もしかするとshiftYの処理がそのままなのではないでしょうか?

説明がわかりづらかったかもしれません。
shiftYの処理は以下のように元の状態に戻して下さい。

コード: 全て選択

Game_CharacterBase.prototype.shiftY = function() {
    return this.isObjectCharacter() ? 0 : 6;
};


ただ、サイズを変えてみて気づいたのですがキャラ画像サイズによって_anchorで1変えた時に動く量が変わるようです。
_anchor=1で元の位置。そこから1変更するとキャラクターのサイズ分ずれる仕様のようです。

(v)の数値をタイルのサイズで割っていたのですが、画像サイズで割らないと正しいピクセル数ずれないかもしれません。
しかしこの処理の時点ではキャラクターのサイズが取得できません。
もう一工夫必要かもしれません。
後ほど修正するので少々お待ち頂けないでしょうか。
animestorm5
記事: 4
登録日時: 2022年1月28日(金) 07:06

Re: キャラチップのファイル名でマップ上でのY軸表示変更

投稿記事by animestorm5 » 2022年1月28日(金) 07:19

Ammzing post keep it up:)
アバター
なぴぃ
記事: 41
登録日時: 2021年12月19日(日) 19:47
連絡を取る:

Re: キャラチップのファイル名でマップ上でのY軸表示変更

投稿記事by なぴぃ » 2022年1月28日(金) 08:10

Keep it up the good work:)

I wrote the entire process so that it can be helpful to many people.
I am glad if it was helpful to you.
なぴぃ
Twitter: https://twitter.com/napiiey
プラグイン置き場: https://napiiey.github.io/plugins/
アバター
こめかみ
記事: 104
登録日時: 2017年9月06日(水) 19:34
連絡を取る:

解決)キャラチップのファイル名でマップ上でのY軸表示変更

投稿記事by こめかみ » 2022年1月29日(土) 01:46

>なぴぃ様
お返事遅くなりました!
プラグインverは今回使用するARPGプラグイン"MOG_ChronoEngine.js"と競合したのですが(他の作品を作る際に活用させて頂こうと思います!)コアスクリプト改変verは理想通りの動作になりました!
色々と細かい要望にお応え頂き本当にありがとうございます!

お待たせしました。うまく処理を行う方法が見つかりましたので共有します。

Game_CharacterBase.prototype.setImage に加えた変更はそのままです。
それ以外の処理は元に戻して下さい。

そして Sprite_Character.prototype.updateCharacterFrame に処理を追加します。
[code]Sprite_Character.prototype.updateCharacterFrame = function() {
var pw = this.patternWidth();
var ph = this.patternHeight();
var sx = (this.characterBlockX() + this.characterPatternX()) * pw;
var sy = (this.characterBlockY() + this.characterPatternY()) * ph;
this.updateHalfBodySprites();
if (this._bushDepth > 0) {
var d = this._bushDepth;
this._upperBody.setFrame(sx, sy, pw, ph - d);
this._lowerBody.setFrame(sx, sy + ph - d, pw, d);
this.setFrame(sx, sy, 0, ph);
} else {
this.setFrame(sx, sy, pw, ph);
}
//↓追加分
if(this._character.offsetShiftY){
this._anchor._y=1+this._character.offsetShiftY/this.patternHeight();
};
};
これで画像の高さが取得できた時に画像の高さで数値を割る事で常に入力したドット数だけずれるようになります。

いろいろ変更を行いややこしい事になってしまった為プラグイン化してみました。
画像を下に動かすだけでなく上下左右自由にずらせてエフェクトの位置等も独立して操作できる機能強化版になっています。
イベントのメモ欄からも設定できます。
https://napiiey.github.io/plugins/napi_mapcharacteroffset.html

こちらを使う場合は今まで加えたコアスクリプトの変更を元に戻してから導入して下さい。
機能強化に伴いファイル名の記述方法等も変わっている為ご注意下さい。


確かに自分で二次関数のように数値を打っておりました。間抜けなことを聞いてしまい申し訳ありません;
確認したところshiftYは昨日の変更後のものではなく、気づかず変更を戻してしまっていたデフォルトの上記でした。なので添付した画像はデフォルトで試行したものでした。
改めて画像を見返してみたのですが、画像サイズの分大きくずれてただけで二次関数にはなっていませんね。
入力している値が12,24,48,96と二次関数的になっているので当然位置も二次関数的になっているだけのように思います。
実際v0からv48までの距離とv48からv96までの距離は等しくなっています。
ですので元々正しい状態になっていたのだと思います。

“MV:質問” へ戻る