【解決】セーブ時セーブスロット(list)に指定のピクチャを置けるようにするには

cocola
記事: 76
登録日時: 2017年4月04日(火) 12:24

【解決】セーブ時セーブスロット(list)に指定のピクチャを置けるようにするには

投稿記事by cocola » 2018年4月23日(月) 19:57

AltSaveScreenについての質問です。
こちらのプラグインを自己流ながら改変し
セーブスロットにひとまず歩行グラを持ってくることができたのですが、
ならばと思いもう一つやりたい事が増えまして、
歩行グラの横にも自前で用意したピクチャ(セーブを行った各マップの目印としての役割)を置くには
以下をどのように書き換えたらうまく動作してくれるでしょうか…?
2018-4-23_18-44-32.png
2018-4-23_18-44-32.png (31.25 KiB) 閲覧数: 3447 回


解決につき書いたコードを削除いたしました。
最後に編集したユーザー cocola on 2018年4月27日(金) 02:27 [ 編集 1 回目 ]

アバター
フトコロ
記事: 1029
登録日時: 2017年2月06日(月) 21:32

Re: セーブ時セーブスロット(list)に指定のピクチャを置けるようにするには

投稿記事by フトコロ » 2018年4月23日(月) 21:28

こんにちは。

とりあえず、Window_SavefileList.prototype.drawMapPicture()の中身ですね。
この関数のなかで、同じdrawMapPicture()を実行していますが、これは誤記でしょうか。
実際に画像を表示させる部分の処理が見当たらないのですが。

参考までに、私が画像をウィンドウに表示させるときの処理を添付します。

Window_Base.prototype.drawImage = function(filename, dx, dy) {
var bitmap = ImageManager.loadPicture(filename);//img/picturesフォルダ内の画像を読み込む
if (!bitmap) return;
//sx,sy,sw,shで表示させる画像のサイズを指定する
var sw = bitmap.width;
var sh = bitmap.height;
var sx = 0;
var sy = 0;
//dx,dy,dw,dhで実際に表示させる大きさを指定する
var dh = sh;
var dw = sw;
this.contents.blt(bitmap, sx, sy, sw, sh, dx, dy, dw, dh);//これで、設定したサイズに合わせて画像を表示
};

参考になれば幸いです。
---------------------------------------------------------------------------------------------------
プラグイン置き場(GitHub)
https://github.com/futokoro/RPGMaker/blob/master/README.md

検討中の内容は上記リンク先の「対応するかもしれないプラグインのメモ」を参照してください。
cocola
記事: 76
登録日時: 2017年4月04日(火) 12:24

Re: セーブ時セーブスロット(list)に指定のピクチャを置けるようにするには

投稿記事by cocola » 2018年4月24日(火) 00:41

フトコロ様こんばんは! ご返信ありがとうございます(>_<)
drawMapPictureは言われてからミスに気づきました…
まさに、実際に画像を表示させる部分の処理の部分の調整方法がわからず
非常に詰まっております…

DataManager.makeSavefileInfo = function () {

info.mapimage = this._mapImg;

};

Window_Base.prototype.createMapImg(←drawMapImageから変更) = function () {
this._mapImg = new Sprite();
if ($dataMapInfos[n].name = ['10:1F']) {
this._mapImg.bitmap = ImageManager.loadPicture('Map_1F');
}
if ($dataMapInfos[n].name = ['06:2F']) {
this._mapImg.bitmap = ImageManager.loadPicture('Map_2F');
}
this._mapImg.visible = true;
this.addChild(this._mapImg);
};

Window_SavefileList.prototype.drawMapPicture = function (filename, x, y) {

var bitmap = ImageManager.loadPicture(filename);
if (!bitmap) return;
//sx,sy,sw,shで表示させる画像のサイズを指定する
var sw = bitmap.width;
var sh = bitmap.height;
var sx = 0;
var sy = 0;
//dx,dy,dw,dhで実際に表示させる大きさを指定する
var dx = sx;//←dx,dyの指定がないとエラー落ちしたのでやみくもに記述
var dy = sy;
var dh = sh;
var dw = sw;
this.createMapImg(bitmap, sx, sy, sw, sh, dx, dy, dw, dh);//これで、設定したサイズに合わせて画像を表示

}
とりあえず紛らわしくなる名前設定を書き換え、
教えていただいたコードの仕様にならってピクチャ(原寸96*96)を表示させようと試みたのですが、
なかなか↑の理解が追いつかず色々といじってみてもお手上げ状態で、
せっかくヒントをいただけたのにうまく活かせられず申し訳ないです…
アバター
フトコロ
記事: 1029
登録日時: 2017年2月06日(月) 21:32

Re: セーブ時セーブスロット(list)に指定のピクチャを置けるようにするには

投稿記事by フトコロ » 2018年4月24日(火) 20:09

少し長いです。


前回こちらが提示した関数ですが、最後の
this.contents.blt(bitmap, sx, sy, sw, sh, dx, dy, dw, dh);
これは、変えてはだめです。
具体的には、this.contents.blt();はそのまま使用してください。

this.contentsという変数も、blt()という関数も
どちらもMVのコアスクリプトで定義されているものなので
そのまま使用できます。

ただ、Window_Base.prototype.createMapImg()で定義しようとしている、
Spriteを新たに用意してそこで画像を表示させる方法を使うのであれば、
提示したWindow_Base.prototaype.drawImage()は不要です。

なお、このWindow_Base.prototype.createMapImg()内ですが

if ($dataMapInfos[n].name = ['10:1F']) { について
判定式が代入になってしまっています。等しいとしたい場合は、 == か === です。
あと、['10:1F']と配列にしていますが、これはそういうようにどこかで定義しているということですか?
$dataMapInfos[n].name は通常文字列が入っています。

なお、新たにSprite()で定義したthis._mapImgのbitmap変数に画像を読み込ませた場合には
表示サイズを定義する必要があります。
具体的には
this._mapImg.setFrame(x, y, width, height);
を実行してください。
x, y, width, heightには、表示させたい位置と画像サイズに合わせて値を代入しますが
今回の場合なら
this._mapImg.setFrame(0, 0, 96, 96);
でいいかと思います。

最後に、新たにSprite()を追加してそこに画像を表示させる場合は
ウィンドウ内のカーソルがスクロールした時の表示更新に気をつけてください。



どうしてもうまくいかないときは、何も手を入れていないAltSaveScreen.jsに以下を加えてみてください。
それで、img/Picturesフォルダに image.png という画像を用意してください。
それでとりあえず、画像が表示できます。

コード: 全て選択

    var _drawContens = Window_SavefileList.prototype.drawContents;
    Window_SavefileList.prototype.drawContents = function(info, rect, valid) {
        this.drawImage('image', rect.x, rect.y);
        _drawContens.call(this, info, rect, valid);
    };

    Window_SavefileList.prototype.drawImage = function(name, dx, dy) {
        var bitmap = ImageManager.loadPicture(name);
        if (!bitmap) return 1;
        var sw = bitmap.width;
        var sh = bitmap.height;
        var sx = 0;
        var sy = 0;
        var dh = sh;
        var dw = sw;
        this.contents.blt(bitmap, sx, sy, sw, sh, dx, dy, dw, dh);
    };
---------------------------------------------------------------------------------------------------
プラグイン置き場(GitHub)
https://github.com/futokoro/RPGMaker/blob/master/README.md

検討中の内容は上記リンク先の「対応するかもしれないプラグインのメモ」を参照してください。
cocola
記事: 76
登録日時: 2017年4月04日(火) 12:24

Re: セーブ時セーブスロット(list)に指定のピクチャを置けるようにするには

投稿記事by cocola » 2018年4月26日(木) 00:48

フトコロ様こんばんは、お世話になります…!

しばらく格闘しておりましたが、作成していただいたコードを指示の通りAltSaveScreen.jsに書き加え
微調整も行ったところ、目指す形に近いものが出来上がってきました…!
2018-4-25_23-50-56.png
2018-4-25_23-50-56.png (14.48 KiB) 閲覧数: 3303 回
if ($dataMapInfos[n].name = ['10:1F']) {に関しては、表示させたいピクチャを何故かマップ名で分岐させようと
素人ながらに記述して案の定間違いだらけだったというわけだったのですが
もしプラグイン内の分岐でピクチャを変更するなら今度はマップIDか変数かで行おうと考えております…
が、教えていただいた
var _drawContens = Window_SavefileList.prototype.drawContents;
Window_SavefileList.prototype.drawContents = function(info, rect, valid) {
this.drawImage('image', rect.x, rect.y);
_drawContens.call(this, info, rect, valid);
};
の'image'を可変的(セーブ画面における歩行グラ変更時やプレイ時間の更新時のよう)
にするには、どういった方法がとれるでしょうか?

何度も厚かましくお尋ねばかりですみません(;>_<;)
アバター
フトコロ
記事: 1029
登録日時: 2017年2月06日(月) 21:32

Re: セーブ時セーブスロット(list)に指定のピクチャを置けるようにするには

投稿記事by フトコロ » 2018年4月26日(木) 18:59

cocola さんが書きました:もしプラグイン内の分岐でピクチャを変更するなら今度はマップIDか変数かで行おうと考えております…
が、教えていただいた
var _drawContens = Window_SavefileList.prototype.drawContents;
Window_SavefileList.prototype.drawContents = function(info, rect, valid) {
this.drawImage('image', rect.x, rect.y);
_drawContens.call(this, info, rect, valid);
};
の'image'を可変的(セーブ画面における歩行グラ変更時やプレイ時間の更新時のよう)
にするには、どういった方法がとれるでしょうか?

方法はいろいろと取れるでしょうが、分かりやすい方法であれば
Window_SavefileList.prototype.drawContents() に渡される info オブジェクトを利用するのがいいかなと思います。

ピクチャをセーブごとに変える方法ですが、特に分岐とかせずに、マップの名前と同じ画像ファイル名にするのがらくだと思います。

1.画像を用意
MAP001のマップの画像なら、MAP001.png
といったように。
この場合、極力マップ名は英数字のみにしたほうがいいですね。

2.セーブ時にマップ名も記録する
cocolaさんが考えているように、DataManager.makeSavefileInfo()の中に処理を追加します。
なお、現在いるマップ名は以下のスクリプトで取得できます。
DataManager.makeSavefileInfo = function() {

info.mapName = $dataMapInfos[$gameMap.mapId()].name;

};

3.drawImageにセーブしたマップ名を渡す。下のように修正
this.drawImage(info.mapName, rect.x, rect.y);
---------------------------------------------------------------------------------------------------
プラグイン置き場(GitHub)
https://github.com/futokoro/RPGMaker/blob/master/README.md

検討中の内容は上記リンク先の「対応するかもしれないプラグインのメモ」を参照してください。
cocola
記事: 76
登録日時: 2017年4月04日(火) 12:24

Re: セーブ時セーブスロット(list)に指定のピクチャを置けるようにするには

投稿記事by cocola » 2018年4月27日(金) 02:24

教えていただいた方法をのとおり、コードを書き加え画像を用意しテストプレイしたところ
無事、マップごとの画像をセーブスロットに表示させることができました…!!
2018-4-27_1-44-54.png
感動
2018-4-27_1-44-54.png (14.65 KiB) 閲覧数: 3209 回

フトコロ様、長らくこのスレッドにお付き合いいただき光栄です!
せっかくお時間を割いていただいてる間、返信が毎度遅れまして申し訳ありません(;>_<;)
とんちんかんな質問にも手厚く対応していただいたおかげで、
させてみたかった動作を実現させることが叶いました、
感謝申し上げます、ありがとうございます…!!
今回学んだ内容は他の場面にも応用できそうです(〃'▽'〃)

“MV:質問” へ戻る