【解決済み】メニュー画面の任意の場所にSVバトラーを表示したい

maker-b
記事: 112
登録日時: 2016年3月27日(日) 22:03
連絡を取る:

【解決済み】メニュー画面の任意の場所にSVバトラーを表示したい

投稿記事by maker-b » 2017年2月25日(土) 16:19

皆様

いつも大変お世話になっております。BOBともうします。
タイトルの通り、現在メニュー画面をカスタマイズしております。
使わせて頂いておりますメニューにおけるプラグインは

MOG_HUNTER様の

MOG_Scene_Menu.js 及びそれに付随するものとなります。

見た目が大きくかわり大変満足しておりますが、自分なりにカスタマイズしたいと思い

立ち絵の右下あたりにキャラクター毎にSVバトラーを表示したいと思っております。
そこで、皆様のお知恵を拝借したいのですが、
今後の勉強の為、

任意の場所に、任意のSVバトラーを表示するコードをご教示いただけないでしょうか・・・

このメインメニューにかぎらず、アイテム使用時や、ステータス時も立ち絵と並列でSVバトラーを
表示したいと思っております。

ぜひよろしくお願いいたします
最後に編集したユーザー maker-b on 2017年3月14日(火) 14:18 [ 編集 1 回目 ]

奏ねこま
記事: 702
登録日時: 2016年1月20日(水) 20:04

Re: メニュー画面の任意の場所にSVバトラーを表示したい

投稿記事by 奏ねこま » 2017年2月25日(土) 17:08

どのレベルでお教えすれば良いかわからないので、
とりあえず「マップ表示中に画面の真ん中あたりにアクター1番のSVキャラを表示する」スクリプトを書いてみます。

コード: 全て選択

var sprite = new Sprite_Actor($gameActors.actor(1));
sprite.setHome(400,300);
sprite.startMove(0,0,0);
sprite.startMotion('walk');
SceneManager._scene._spriteset.addChild(sprite);

上記をイベントコマンドの「スクリプト」で実行すると、画面真ん中あたりにポンと現れます。
コード中の「'walk'」はモーションの指定ですが、walk以外に何があるかは
rpg_sprites.jsのSprite_Actorのところを見てみてください。
maker-b
記事: 112
登録日時: 2016年3月27日(日) 22:03
連絡を取る:

Re: メニュー画面の任意の場所にSVバトラーを表示したい

投稿記事by maker-b » 2017年2月25日(土) 23:57

奏ねこま 様

お世話になっております。
早速の回答ありがとうございます!
当該スクリプトを実行してとりあえず画面中央にアクターを表示させることができました!
ありがとうございます。

YEP_X_BattleSysCTBを入れていますが、その場合

SceneManager._scene._spriteset.addChild(sprite);
このコードでエラーになってしまします。

YEP_X_BattleSysCTBが rpg_sprites.js
のどこかをオーバーライドしているんでしょうか。
素人ゆえ、原因がわからず、上記プラグインをオフにしました!

いただいた構文は

var sprite = new Sprite_Actor($gameActors.actor(1)); <変数宣言? Sprite_Actorのインスタンスを作る?
sprite.setHome(400,300); <上記変数の座標を決める
sprite.startMove(0,0,0); <上記変数をループし始める?
sprite.startMotion('walk'); <上記変数の動きは"walk"にする
SceneManager._scene._spriteset.addChild(sprite); <画面上に子スプライトを追加する

みたいな理解でよろしいでしょうか?

この場合、メニューでActor1を表示する場合、
SceneManager._scene._spriteset.addChild(sprite);
このコードの前半部分を書き換えればOKとなりますでしょうか?

素人で申し訳ありません・・・・
引き続きよろしくお願いいたします。
アバター
まっつUP
記事: 1155
登録日時: 2016年8月11日(木) 15:38
お住まい: タケノコ王国

Re: メニュー画面の任意の場所にSVバトラーを表示したい

投稿記事by まっつUP » 2017年2月26日(日) 00:45

bobyama様

YEP_X_BattleSysCTBを導入している時に起こるその不具合は
バトルシーン中にのみ表示することを想定しているウインドウ(ctbicon)を
Sprite_Battlerで生成しているからです。

該当箇所はオーバーライドと言うよりかは単純に処理をフックしているだけだと思います。
とはいえ$gameParty.inBattle()では判定できないタイミングです。

SceneManager._sceneで現在のシーンを事実上判定できるので
これを使えば共存はできると思います。
RPGで笑顔を・・・

ツイッター(ツクラーの巣窟)(閲覧は自己責任でお願いします)
https://twitter.com/mattuup

github
https://github.com/mattuup/RPGMakerMZ
maker-b
記事: 112
登録日時: 2016年3月27日(日) 22:03
連絡を取る:

Re: メニュー画面の任意の場所にSVバトラーを表示したい

投稿記事by maker-b » 2017年2月26日(日) 02:01

まっつUP様

お世話になっております。

SceneManager._sceneで現在のシーンを事実上判定できるので
これを使えば共存はできると思います。

>おっしゃるとおり、無事表示することができました!
 ありがとうございます。

ちなみに、一度表示したスプライト
SceneManager._scene.addChild(sprite);
を消す場合は

このスプライトをどのように取得して消すことができますでしょうか?
SceneManager._scene.removeChild(???);
みたいな感じでしょうか?
奏ねこま
記事: 702
登録日時: 2016年1月20日(水) 20:04

Re: メニュー画面の任意の場所にSVバトラーを表示したい

投稿記事by 奏ねこま » 2017年2月26日(日) 05:19

bobyama さんが書きました:いただいた構文は

var sprite = new Sprite_Actor($gameActors.actor(1)); <変数宣言? Sprite_Actorのインスタンスを作る?
sprite.setHome(400,300); <上記変数の座標を決める
sprite.startMove(0,0,0); <上記変数をループし始める?
sprite.startMotion('walk'); <上記変数の動きは"walk"にする
SceneManager._scene._spriteset.addChild(sprite); <画面上に子スプライトを追加する

みたいな理解でよろしいでしょうか?

概ね合っていますが、startMoveだけ違います。
説明が少々めんどうなので、試しに「startMove(300,0,0)」など、数値を変更してみてください。
startMoveが何を設定しているのかわかると思います。

bobyama さんが書きました:この場合、メニューでActor1を表示する場合、
SceneManager._scene._spriteset.addChild(sprite);
このコードの前半部分を書き換えればOKとなりますでしょうか?

その理解でOKです。前半部分というか、addChildより前全部ですが。
参考コードを(画像ですが)貼っておきます。
00.png

addChildしているthis._characters[i]._charは、キャラクターの立ち絵画像です。
この参考コードで注意してほしいのは「setHome(85,-120)」の部分。
まず「画面座標ではない」こと。addChildした相手であるキャラクター立ち絵画像を基準とした座標です。
そして「Y座標がマイナス値である」こと。キャラクター立ち絵画像の「底辺座標」を基準としています。
これはaddChild先であるthis._characters[i]._charのanchor.yが1.0になっているためなのですが(標準は0.0)、
anchor.yが何なのか、1.0だと何故底辺基準なのかについては割愛させてください。

bobyama さんが書きました:ちなみに、一度表示したスプライト
SceneManager._scene.addChild(sprite);
を消す場合は

このスプライトをどのように取得して消すことができますでしょうか?
SceneManager._scene.removeChild(???);
みたいな感じでしょうか?

addChildしたものをそのままremoveChildに渡せば消えますので、この場合removeChild(sprite)になります。
spriteの中身が、addChildしたときのものと同じであれば、ですが。
ちなみに、明示的にremoveChildする機会というのは、そう多くないと思います。
addChild先が消えたら、子供も一緒に消えることになりますので。
最後に編集したユーザー 奏ねこま on 2017年3月12日(日) 10:09 [ 編集 1 回目 ]
maker-b
記事: 112
登録日時: 2016年3月27日(日) 22:03
連絡を取る:

Re: メニュー画面の任意の場所にSVバトラーを表示したい

投稿記事by maker-b » 2017年2月26日(日) 23:42

奏ねこま 様

お世話になっております
サポート誠にありがとうございました。

addChildしているthis._characters[i]._charは、キャラクターの立ち絵画像です。
この参考コードで注意してほしいのは「setHome(85,-120)」の部分。
まず「画面座標ではない」こと。addChildした相手であるキャラクター立ち絵画像を基準とした座標です。


承知しました。
なるほど、add先は画面ではなく、立ち絵画像なんですね。大変勉強になります。

上記のコードで無事うまくいきました!
ありがとうございます!

質問させて頂いた removeChildですが、上記の実装方法だと不要となりそうです。
このメニューの次に

Yamfly様の ClassChangeCore を入れており、以下のような画面でSVキャラを表示しようとしております。

無題.jpg


この際の課題は、上記画像のように、キャラクターを入れ替えた際、前のSVキャラが消えない、というもの
でした。
現在、SceneManager._scene.addChild(sprite);で画面に直接addしているイメージだと思いますが、
これをSVキャラクターの左のバストアップ画像にaddすれば、キャラを変えた際にバストアップも変わるので
運用ができそうです・・・・

ちなみに、add先のバストアップを指定する場合、どうやって調べればよいのでしょうか・・・
奏ねこま
記事: 702
登録日時: 2016年1月20日(水) 20:04

Re: メニュー画面の任意の場所にSVバトラーを表示したい

投稿記事by 奏ねこま » 2017年2月27日(月) 00:46

バストアップ画像(顔画像)はウインドウ内に直接貼り付けられてるもので、単独のSpriteではないのでaddChildできません。
そもそも、キャラクター変更のたびにnew Sprite_Actorで作り直す必要もありません。
Sprite_ActorにはsetBattlerという関数があり、引数にアクターを指定することで変更可能です。
アクターを変更すると表示座標が狂うので、setHomeで設定しなおしてください。

一度、Sprite_Actorの中身をご自身で確認されることをオススメします。
maker-b
記事: 112
登録日時: 2016年3月27日(日) 22:03
連絡を取る:

Re: メニュー画面の任意の場所にSVバトラーを表示したい

投稿記事by maker-b » 2017年3月04日(土) 23:43

奏ねこま 様

大変お世話になっております。
回答が遅くなり申し訳ありません。

Sprite_ActorにはsetBattlerという関数があり、引数にアクターを指定することで変更可能です。
アクターを変更すると表示座標が狂うので、setHomeで設定しなおしてください。

一度、Sprite_Actorの中身をご自身で確認されることをオススメします。


ご丁寧に詳細情報ありがとうございます。
残念ながらプログラムは全くの素人ですので、JavaScriptを一から勉強しながら進めていきたいと思います。
おそらく上記のご回答だと
1 アクターが変わるタイミングで呼び出される関数をみつけて
2 その関数内に setBatter関数を入れて
3 setHomeで座標を整えるだけ
で実装ができそうな気がします。
頑張って勉強してみます!
ありがとうございました!
アバター
フトコロ
記事: 1029
登録日時: 2017年2月06日(月) 21:32

Re: メニュー画面の任意の場所にSVバトラーを表示したい

投稿記事by フトコロ » 2017年3月05日(日) 00:13

bobyamaさん

横から失礼します。

すでにあるウィンドウに画像を表示する場合、アクターのフェイス画像を表示させているのと同じ方法で、アクターのSV画像を表示させることは可能ですよ。

アクターのフェイス画像を表示している関数は、rpg_window.js内のdrawActorFace関数です。
>2017/03/05 すみません、下のコードにつけた注記が間違っていましたので修正しました。

コード: 全て選択

Window_Base.prototype.drawActorFace = function(actor, x, y, width, height) {
    this.drawFace(actor.faceName(), actor.faceIndex(), x, y, width, height);
};

Window_Base.prototype.drawFace = function(faceName, faceIndex, x, y, width, height) {
    width = width || Window_Base._faceWidth;
    height = height || Window_Base._faceHeight;
    var bitmap = ImageManager.loadFace(faceName); //フェイス画像の読み込み
    var pw = Window_Base._faceWidth; //デフォルトで規定しているフェイス画像用の幅
    var ph = Window_Base._faceHeight; //デフォルトで規定しているフェイス画像用の高さ
    //画像のサイズに関する値
    var sw = Math.min(width, pw);
    var sh = Math.min(height, ph);
    //表示位置に関する値
    var dx = Math.floor(x + Math.max(width - pw, 0) / 2);
    var dy = Math.floor(y + Math.max(height - ph, 0) / 2);
    //sx,syは画像内のどの位置の絵を使うかに関する値
    var sx = faceIndex % 4 * pw + (pw - sw) / 2;
    var sy = Math.floor(faceIndex / 4) * ph + (ph - sh) / 2;
    this.contents.blt(bitmap, sx, sy, sw, sh, dx, dy);
};


上のコードの中の、ImageManager.loadFace(faceName)でフェイス画像をimgフォルダ内から読み込んでいます。
ImageManager.loadFace()の中身はrpg_managers.jsの中にある下の関数です。

コード: 全て選択

ImageManager.loadFace = function(filename, hue) {
    return this.loadBitmap('img/faces/', filename, hue, true);
};


上のコードを見れば、loadBitmapという関数で、/img/faces/filename.pngをロードしているということが分かると思います。

使いたい画像の保存先やファイル名、画像のサイズを考えて、上の関数の中身を書き換えれば、SV画像を表示させる関数にすることができます。

あとは、作ったdraw関数をdrawActorFace関数が呼ばれている関数内に追加すれば、フェイス画像と同じようにSV画像を表示させることができます。
---------------------------------------------------------------------------------------------------
プラグイン置き場(GitHub)
https://github.com/futokoro/RPGMaker/blob/master/README.md

検討中の内容は上記リンク先の「対応するかもしれないプラグインのメモ」を参照してください。

“MV:質問” へ戻る