解決)キャラチップのファイル名でマップ上でのY軸表示変更
解決)キャラチップのファイル名でマップ上でのY軸表示変更
以前にも似たような質問~アドバイスを頂いたのですが、どうしても解決できず再度質問させて頂きます。
・キャラチップ画像のファイル名に特定の文字と数が含まれている場合、マップ上でのY軸の表示を下げたい。
・例として$monster_01(v96).pngという画像ファイルの場合、マップ上で96ドット下げて表示をしたい。
・但し、画像表示のみをずらし、イベント本来の座標位置はそのままにしたい。
・メモ欄等ゲームデータを使用するタイプのプラグインではなく、画像ファイル名そのもので処理を行いたい。
上記、解決する方法またはプラグインはないでしょうか?
MOG_CharPoses.js というプラグインが近い挙動なのですが、こちらはイベントの座標はズレないのですが、Y軸でのイベント間の表示プライオリティが何故かズレてしまうようです。
rpg_managers 及び rpg_objects で処理している「ファイル名の頭に"!" を記述しない事による位置ズレ」は画像表示のみずらしているようで、画像2枚目の6502行目の計算式に新しく定義した値を入れる事ができれば解決しそうなのですが...
・キャラチップ画像のファイル名に特定の文字と数が含まれている場合、マップ上でのY軸の表示を下げたい。
・例として$monster_01(v96).pngという画像ファイルの場合、マップ上で96ドット下げて表示をしたい。
・但し、画像表示のみをずらし、イベント本来の座標位置はそのままにしたい。
・メモ欄等ゲームデータを使用するタイプのプラグインではなく、画像ファイル名そのもので処理を行いたい。
上記、解決する方法またはプラグインはないでしょうか?
MOG_CharPoses.js というプラグインが近い挙動なのですが、こちらはイベントの座標はズレないのですが、Y軸でのイベント間の表示プライオリティが何故かズレてしまうようです。
rpg_managers 及び rpg_objects で処理している「ファイル名の頭に"!" を記述しない事による位置ズレ」は画像表示のみずらしているようで、画像2枚目の6502行目の計算式に新しく定義した値を入れる事ができれば解決しそうなのですが...
- 添付ファイル
-
- ev1.png (26.57 KiB) 閲覧された回数 3580 回
-
- ev2.png (41 KiB) 閲覧された回数 3580 回
最後に編集したユーザー こめかみ [ 2022年2月03日(木) 18:13 ], 累計 1 回
Re: キャラチップのファイル名でマップ上でのY軸表示変更
こんにちは。
何のためにこの処理が必要なのか全く分かりませんが、
もし、「試してません」なのであれば、試してみればイイのではないでしょうか?
ちなみに、処理を「ファイル名を調べる」「表示をずらす」で分けて考えるとして、
上記を試せば、「表示をずらす」ことが出来るかどうかチェック出来ると思います。
順番にステップを進めましょう。
何のためにこの処理が必要なのか全く分かりませんが、
この「ですが……」の後に何が隠されているのでしょうか?こめかみ さんが書きました:rpg_managers 及び rpg_objects で処理している「ファイル名の頭に"!" を記述しない事による位置ズレ」は画像表示のみずらしているようで、画像2枚目の6502行目の計算式に新しく定義した値を入れる事ができれば解決しそうなのですが...
もし、「試してません」なのであれば、試してみればイイのではないでしょうか?
ちなみに、処理を「ファイル名を調べる」「表示をずらす」で分けて考えるとして、
上記を試せば、「表示をずらす」ことが出来るかどうかチェック出来ると思います。
順番にステップを進めましょう。
▼だいたいTwitterにいます。たぶん。
https://twitter.com/kuroudo119
https://twitter.com/kuroudo119
Re: キャラチップのファイル名でマップ上でのY軸表示変更
既にレスがついていたようですね。
「ですが...」の後は「ここから先どうしたらいいのかわかりません。」と勝手に脳内補完して解説を書いてしまったので投下します。
(「ですが...」の後が「試してません」だったら確かに試してから相談して下さいという感じなので、このほぼ正解にたどり着いてるところから何ができなくて躓いたのか書いて頂けると回答もしやすかったかと思います。)
・解説
挙げられていた処理の他に実際にはもう一つ重要な処理があります。
流れとしてはまずこのsetImageが呼び出され、ImageManager.isObjectCharacterのメソッドでファイル名を判定。
先頭に!がついていればこのキャラクターの_isObjectCharacter にtrueを格納します。
最終的にそのshiftYのメソッドで_isObjectCharacterがtrueかどうかでy座標を変えています。
(shiftYメソッド内のisObjectCharacterメソッドは先ほどのImageManager.isObjectCharacterとは別物で_isObjectCharacter に格納された値を返すだけのものです。)
shftYだけに this._characterNameに応じてy座標を変えるように変更を加えればよさそうにも思えますが、このメソッドはアップデート処理で頻繁に呼ばれます。
毎回呼ばれる度に名前の中から(v数字)といったパターンを検索していては非常に処理が重くなってしまう為やはりSetImageの段階で値を格納しておく必要があります。
(v~~)の中の数値を取り出すには正規表現のキャプチャーグループという機能を使います。
具体的には以下のようになります。
そしてshiftYメソッドでこの値を使うように書き換えます。
これで$monster_01(v96).pngの画像の場合y座標が96ドット下にずれるようになります。
「ですが...」の後は「ここから先どうしたらいいのかわかりません。」と勝手に脳内補完して解説を書いてしまったので投下します。
(「ですが...」の後が「試してません」だったら確かに試してから相談して下さいという感じなので、このほぼ正解にたどり着いてるところから何ができなくて躓いたのか書いて頂けると回答もしやすかったかと思います。)
・解説
挙げられていた処理の他に実際にはもう一つ重要な処理があります。
コード: 全て選択
Game_CharacterBase.prototype.setImage = function(characterName, characterIndex) {
this._tileId = 0;
this._characterName = characterName;
this._characterIndex = characterIndex;
this._isObjectCharacter = ImageManager.isObjectCharacter(characterName);
};
先頭に!がついていればこのキャラクターの_isObjectCharacter にtrueを格納します。
最終的にそのshiftYのメソッドで_isObjectCharacterがtrueかどうかでy座標を変えています。
(shiftYメソッド内のisObjectCharacterメソッドは先ほどのImageManager.isObjectCharacterとは別物で_isObjectCharacter に格納された値を返すだけのものです。)
shftYだけに this._characterNameに応じてy座標を変えるように変更を加えればよさそうにも思えますが、このメソッドはアップデート処理で頻繁に呼ばれます。
毎回呼ばれる度に名前の中から(v数字)といったパターンを検索していては非常に処理が重くなってしまう為やはりSetImageの段階で値を格納しておく必要があります。
(v~~)の中の数値を取り出すには正規表現のキャプチャーグループという機能を使います。
具体的には以下のようになります。
コード: 全て選択
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からマイナスした値を格納する。
};
};
コード: 全て選択
Game_CharacterBase.prototype.shiftY = function() {
let offsetY = 0;
if( this.offsetShiftY ){ offsetY = this.offsetShiftY }; //this.offsetShiftYに値が入っていた場合offsetYに代入。
return this.isObjectCharacter() ? offsetY : offsetY + 6;
};
Re: キャラチップのファイル名でマップ上でのY軸表示変更
くろうど様
ご返答ありがとうございます。
「ですが...」のあとなのですが
「何度か試してみたが、自分のレベルでは要領を得ない」
「どれくらい要領を得ていないのかもわからない」
「基礎の部分をいじるのはまずいのかも知れない」
「そもそもの考え方自体が合っているのかわからない」
主に上記の理由でした。文章にしないまま投稿をしてしまい申し訳ありません。
中途半端に案を書かず、目的のみを記述すべきでした。
ご返答ありがとうございます。
「ですが...」のあとなのですが
「何度か試してみたが、自分のレベルでは要領を得ない」
「どれくらい要領を得ていないのかもわからない」
「基礎の部分をいじるのはまずいのかも知れない」
「そもそもの考え方自体が合っているのかわからない」
主に上記の理由でした。文章にしないまま投稿をしてしまい申し訳ありません。
上述だけでも理解しきれていないうえに、異なるプラグイン間の把握となるとお手上げ状態でした。ちなみに、処理を「ファイル名を調べる」「表示をずらす」で分けて考えるとして、
上記を試せば、「表示をずらす」ことが出来るかどうかチェック出来ると思います。
順番にステップを進めましょう。
中途半端に案を書かず、目的のみを記述すべきでした。
Re: キャラチップのファイル名でマップ上でのY軸表示変更
なびぃ様
ご回答ありがとうございます。
記述通りの改変で表示位置をずらす事ができました。
説明して頂くと理解できた気になるのですが、解説を読む限り自分には難しい問題だったようです。
自分から提案をしておいての不具合なのですが、
衝突判定の位置情報はズレていないのですが
・イベント同士のY座標における表示プライオリティがずれてしまう
・そのイベントの足元を基準としたアニメーションの表示もずれてしまう
・イベントに決定ボタンでアニメーションを表示する際に、イベントの画像がちらつく
上記が発生してしまいました。
これはやはり提案した方法に問題があるのか、それとも他に関する細かい部分も改変すれば直るものなのでしょうか?
丸投げに継ぐ丸投げの質問で、大変申し訳ございません。
ご回答ありがとうございます。
記述通りの改変で表示位置をずらす事ができました。
説明して頂くと理解できた気になるのですが、解説を読む限り自分には難しい問題だったようです。
自分から提案をしておいての不具合なのですが、
衝突判定の位置情報はズレていないのですが
・イベント同士のY座標における表示プライオリティがずれてしまう
・そのイベントの足元を基準としたアニメーションの表示もずれてしまう
・イベントに決定ボタンでアニメーションを表示する際に、イベントの画像がちらつく
上記が発生してしまいました。
これはやはり提案した方法に問題があるのか、それとも他に関する細かい部分も改変すれば直るものなのでしょうか?
丸投げに継ぐ丸投げの質問で、大変申し訳ございません。
Re: キャラチップのファイル名でマップ上でのY軸表示変更
くろうどさんもおっしゃっていましたが、何を実現する為の処理なのかがわからない為どうなれば正解なのかという明確なビジョンが共有できていなかったかもしれません。・イベント同士のY座標における表示プライオリティがずれてしまう
・そのイベントの足元を基準としたアニメーションの表示もずれてしまう
・イベントに決定ボタンでアニメーションを表示する際に、イベントの画像がちらつく
添付画像を見てみましてもプライオリティは画像に対して正しいプライオリティになっているように思います。
となるとプライオリティを画像の下端ではなくイベント位置に合わせたい(つまり赤い部分が足元)という事でしょうか?
Z座標に応じた描画の処理はツクールのコアスクリプトには定義されておらずpixi.jsの領域のようです。
pixi.jsに関しては詳しくないのですが、sprite単位で処理をしている為spriteの下端が起点になるのは仕様なんじゃないかと思います。
そもそも赤い部分が足元となるようにできた場合その他のイベントが1マス手前を通過するとイベントを踏みつけるような感じになるかと思いますがそれでよいのでしょうか?
(v)で調整したイベントがマップの小物の1マス上を通り抜ける場合も小物の下を通り抜けるようなおかしなことになるような気がしますが。
足元に設定したアニメーションがずれるのもアニメーションがイベントの座標ではなくSprite(画像やアニメーション)に合わせた正しい位置に表示されているという事なんじゃないかと思います。
これらも全て(v)で指定した分上にずらすとなると難易度がかなり上がってしまうように思います。
現状の私の理解ではすぐ対応する事が難しそうです。
アニメーション表示時のイベントのちらつきに関しましてはこちらで試しても発生しなかった為不明です。
何を実現したいかにもよりますが、他の手段を取った方がよさそうな気もします。
Re: キャラチップのファイル名でマップ上でのY軸表示変更
なびぃ様
おっしゃる通りでイベント元位置のプライオリティを比較して表示したいです。
アクションRPGを作成しているのですが、添付したサンプル画像のように(下から踏みつけるとおかしい画像には適用せず)足元より下に武器などを振り回すといったキャラチップに対してY軸の調整を行う目的でした。
現在 "MOG_CharPoses.js"による"(y〇〇)で上下させる"という提案した方法と同じプラグインを使用していたのですが、その際の"下キャラの頭部が上キャラの足元にめり込む"のが気になり、どうにかならないかと質問させて頂きました。
現状、すべてのキャラクター画像を48px上げて作成し、上記のプラグインで48px下げて重なりの違和感を回避していたのですが、それよりも大きい画像を使用する際に(現在は192pxで収まっていますが)、その都度それに合わせて全ての画像を調整し直すのは現実的ではないなという事情でした。
自分なりにいじっていて、アニメーションやプライオリティでのspriteの下端の起点はどこか知らない奥にある仕様の気がしていたのですが、やはりここを変えるのは難しそうなのですね。
アニメーションのちらつきはPCの処理速度が悪く安定していなかったようです、失礼いたしました。
別の手段を考えてみようと思います。ご教授頂きありがとうございます。
おっしゃる通りでイベント元位置のプライオリティを比較して表示したいです。
アクションRPGを作成しているのですが、添付したサンプル画像のように(下から踏みつけるとおかしい画像には適用せず)足元より下に武器などを振り回すといったキャラチップに対してY軸の調整を行う目的でした。
現在 "MOG_CharPoses.js"による"(y〇〇)で上下させる"という提案した方法と同じプラグインを使用していたのですが、その際の"下キャラの頭部が上キャラの足元にめり込む"のが気になり、どうにかならないかと質問させて頂きました。
現状、すべてのキャラクター画像を48px上げて作成し、上記のプラグインで48px下げて重なりの違和感を回避していたのですが、それよりも大きい画像を使用する際に(現在は192pxで収まっていますが)、その都度それに合わせて全ての画像を調整し直すのは現実的ではないなという事情でした。
自分なりにいじっていて、アニメーションやプライオリティでのspriteの下端の起点はどこか知らない奥にある仕様の気がしていたのですが、やはりここを変えるのは難しそうなのですね。
アニメーションのちらつきはPCの処理速度が悪く安定していなかったようです、失礼いたしました。
別の手段を考えてみようと思います。ご教授頂きありがとうございます。
くろうどさんもおっしゃっていましたが、何を実現する為の処理なのかがわからない為どうなれば正解なのかという明確なビジョンが共有できていなかったかもしれません。
添付画像を見てみましてもプライオリティは画像に対して正しいプライオリティになっているように思います。
となるとプライオリティを画像の下端ではなくイベント位置に合わせたい(つまり赤い部分が足元)という事でしょうか?
Z座標に応じた描画の処理はツクールのコアスクリプトには定義されておらずpixi.jsの領域のようです。
pixi.jsに関しては詳しくないのですが、sprite単位で処理をしている為spriteの下端が起点になるのは仕様なんじゃないかと思います。
そもそも赤い部分が足元となるようにできた場合その他のイベントが1マス手前を通過するとイベントを踏みつけるような感じになるかと思いますがそれでよいのでしょうか?
(v)で調整したイベントがマップの小物の1マス上を通り抜ける場合も小物の下を通り抜けるようなおかしなことになるような気がしますが。
足元に設定したアニメーションがずれるのもアニメーションがイベントの座標ではなくSprite(画像やアニメーション)に合わせた正しい位置に表示されているという事なんじゃないかと思います。
これらも全て(v)で指定した分上にずらすとなると難易度がかなり上がってしまうように思います。
現状の私の理解ではすぐ対応する事が難しそうです。
アニメーション表示時のイベントのちらつきに関しましてはこちらで試しても発生しなかった為不明です。
何を実現したいかにもよりますが、他の手段を取った方がよさそうな気もします。
Re: キャラチップのファイル名でマップ上でのY軸表示変更
具体的なやりたい事を説明して頂きありがとうございます。現在 "MOG_CharPoses.js"による"(y〇〇)で上下させる"という提案した方法と同じプラグインを使用していたのですが、その際の"下キャラの頭部が上キャラの足元にめり込む"のが気になり、どうにかならないかと質問させて頂きました。
現状、すべてのキャラクター画像を48px上げて作成し、上記のプラグインで48px下げて重なりの違和感を回避していたのですが、それよりも大きい画像を使用する際に(現在は192pxで収まっていますが)、その都度それに合わせて全ての画像を調整し直すのは現実的ではないなという事情でした。
ようやく完成形がはっきりとイメージできました。
このはみ出した部分にはARPGの武器が来るのですね。
下に剣を向けた際は剣を足で踏む感じになるかと思いますが、キャラのプライオリティがおかしくならなければ剣の違和感は気にしないという事なんですね。
昨日難しいと言いましたが処理を追って読み進めたところ解決できそうでしたので共有します。
こちらはそのままです。
こちらを新しく定義しなおします。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からマイナスした値を格納する。
};
};
ここで値をspriteの方に渡し_anchor._yに設定する事でspriteの位置(様々な処理の起点)はずらさず表示のみずらす事ができそうです。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};
};
Re: キャラチップのファイル名でマップ上でのY軸表示変更
なびぃ様
(射出物の場合は別イベント扱いで処理をするので問題なくいけそうです)
修正したところ画像の重なりが想定通りになりました!
ただ(v)に入れる数値でズレ方が二次関数?のようになるのですが、これはどういった計算になっているのでしょうか??重ねての質問すみません。
はい、どちらの違和感を取るかなのですが、やはり身体部分の重なりの方が気になるなと;具体的なやりたい事を説明して頂きありがとうございます。
ようやく完成形がはっきりとイメージできました。
このはみ出した部分にはARPGの武器が来るのですね。
下に剣を向けた際は剣を足で踏む感じになるかと思いますが、キャラのプライオリティがおかしくならなければ剣の違和感は気にしないという事なんですね。
(射出物の場合は別イベント扱いで処理をするので問題なくいけそうです)
anchor._yが所々書いてあるなと思ったのですが、何かをずらさない時に使うような意味合いのものなんですね。昨日難しいと言いましたが処理を追って読み進めたところ解決できそうでしたので共有します。
こちらはそのままです。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からマイナスした値を格納する。
};
こちらを新しく定義しなおします。ここで値をspriteの方に渡し_anchor._yに設定する事でspriteの位置(様々な処理の起点)はずらさず表示のみずらす事ができそうです。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};
};
修正したところ画像の重なりが想定通りになりました!
ただ(v)に入れる数値でズレ方が二次関数?のようになるのですが、これはどういった計算になっているのでしょうか??重ねての質問すみません。
Re: キャラチップのファイル名でマップ上でのY軸表示変更
コード: 全て選択
ただ(v)に入れる数値でズレ方が二次関数?のようになるのですが、これはどういった計算になっているのでしょうか??重ねての質問すみません。
もしかするとshiftYの処理がそのままなのではないでしょうか?
説明がわかりづらかったかもしれません。
shiftYの処理は以下のように元の状態に戻して下さい。
コード: 全て選択
Game_CharacterBase.prototype.shiftY = function() {
return this.isObjectCharacter() ? 0 : 6;
};
_anchor=1で元の位置。そこから1変更するとキャラクターのサイズ分ずれる仕様のようです。
(v)の数値をタイルのサイズで割っていたのですが、画像サイズで割らないと正しいピクセル数ずれないかもしれません。
しかしこの処理の時点ではキャラクターのサイズが取得できません。
もう一工夫必要かもしれません。
後ほど修正するので少々お待ち頂けないでしょうか。