【解決済み】セーブファイルに表示するアイコン用に、return で一度に 2つの数値(sx, sy)を返す方法を教えていただきたく・・・

アバター
蓮賀まさとき
記事: 26
登録日時: 2020年8月30日(日) 15:00

【解決済み】セーブファイルに表示するアイコン用に、return で一度に 2つの数値(sx, sy)を返す方法を教えていただきたく・・・

投稿記事by 蓮賀まさとき » 2021年11月22日(月) 21:35

「ツクマテ」の皆様、お世話になっております。今回も、どうぞよろしくお願いいたします。

各 jsファイルに以下のように記述して、セーブファイルにプレイヤーさんが選んだ勢力に対応した
家紋のアイコンを表示することに成功しました(添付ファイルあり)。

「rpg_managers」の DataManager.makeSavefileInfo = function() { に
 info.kamon = $gameSystem.kamonContents(); を追加。

「rpg_objects」内に

コード: 全て選択

Game_System.prototype.kamonContents = function() {
   if ($gameVariables.value(4) === 1) {
       var sx = 0;
       var sy = 39;
   } else if ($gameVariables.value(4) === 2) {
       var sx = 64;
       var sy = 39;
          ・
          ・
          ・
   } else if ($gameVariables.value(4) === 15) {
       var sx = 384;
       var sy = 78;
   }
   return sx;
};

「rpg_windows」内に

コード: 全て選択

Window_SavefileList.prototype.drawKamon = function(info, x, y, width) {
   if (info.kamon) {
       var bitmap = ImageManager.loadSystem('IconSet');
       var pw = 64;
       var ph = 39;
       this.contents.blt(bitmap, info.kamon, 39, pw, ph, x, y);
   }
};

ですが、現在は sx、sy いずれか片方しか取得できず、正しい組み合わせで全部は表示できない状態です。
(画像内の「ファイル4」は、もう一段下にあるアイコンが正解となります)
そこで、return で一度に 2つの数値( sx, sy )を返す、もしくは info.kamon 内に両方の値を収める
方法を教えていただけないでしょうか?

また、「ファイル1」のように sx の値を 0 にすると何も表示さません。これはナゼでしょうか?
( rpg_windows では、一番左端を起点としてちゃんと表示されるのですが・・・)
こちらの解消法も合わせてご教授いただけると嬉しいです。

よろしくお願いいたします。
 
添付ファイル
サンプル・ファイル画面.jpg
最後に編集したユーザー 蓮賀まさとき on 2021年11月23日(火) 17:30 [ 編集 1 回目 ]

・ツクールは、「触ってる歴」だけはムダに長いです(^^;
・スクリプトは「XP」で興味を持ち、「VX」「MV」でもレイアウトを変更したり、
 画像やテキスト、新たなウィンドウを追加するなど、デフォルトの簡単な応用で
 カスタマイズを楽しんでいます。
アバター
WTR
記事: 559
登録日時: 2015年12月22日(火) 19:14

Re: セーブファイルに表示するアイコン用に、return で一度に 2つの数値(sx, sy)を返す方法を教えていただきたく・・・

投稿記事by WTR » 2021年11月23日(火) 10:21

コアスクリプトを編集しているのであれば、プラグインとして分離したほうがよいかと思います。

return は1つの値しか返せないので
return で返す値を配列やオブジェクトにして取り出す。
$gameSystem.kamonContents()[0] とか
$gameSystem.kamonContents().sx で取り出せる形にする。

余計なお世話かもしれませんが
iconSet に標準ではない形の画像を混ぜているようなのがちょっと気になりました。
扱いにくそうな気がするので分離したほうがよくないでしょうか。
system フォルダに置けば、ImageManager.loadSystem で別ファイルを読み込むこともできます。
扱いも iconSet と変わりません。

さらに余計なお世話なんですが
kamonContents で if ~ else を繰り返さなくても
キッチリ収めた画像ならシンプルに書けるかと思います。64 x 39 が横に 6個並んでいると思われるので
sx は 変数4 を 6 で割った余り x 64
sy は 変数4 を 6 で割った商 x 39
みたいな計算で表現できるかと。

…というようなことをやったのが↓です

コード: 全て選択

(() => {
   "use strict";
   //=============================================================================
   // Game_System
   //=============================================================================
   Game_System.prototype.kamonContents = function() {
      return {
         sx: ($gameVariables.value(4) % 6) * 64,
         sy: Math.floor(($gameVariables.value(4) / 6)) * 39
      }
   };

   //=============================================================================
   // Window_SavefileList
   //=============================================================================
   const _Window_SavefileList_drawContents = Window_SavefileList.prototype.drawContents;
   Window_SavefileList.prototype.drawContents = function (info, rect, valid) {
      _Window_SavefileList_drawContents.apply(this, arguments);
      const bitmap = ImageManager.loadSystem("Kamon");
      const sx = info.kamon.sx;
      const sy = info.kamon.sy;
      this.contents.blt(bitmap , sx, sy, 64, 39, rect.x, rect.y);
   };

   //=============================================================================
   // DataManager
   //=============================================================================
   const _DataManager_makeSavefileInfo = DataManager.makeSavefileInfo;
   DataManager.makeSavefileInfo = function () {
      const info = _DataManager_makeSavefileInfo.call(this);
      info.kamon = $gameSystem.kamonContents();
      return info;
   };

})();


追記
0起点だと表示されないのはなんだろう… もともと iconSet は左上が空白ですがそのあたりが関係している?
どういう画像に編集したのかわからないのでなんともいえないです
添付ファイル
Kamon.png
Kamon.png (1.96 KiB) 閲覧数: 1176 回
Twitter、はじめました。
https://twitter.com/wtr_in_reverie/
アバター
WTR
記事: 559
登録日時: 2015年12月22日(火) 19:14

Re: セーブファイルに表示するアイコン用に、return で一度に 2つの数値(sx, sy)を返す方法を教えていただきたく・・・

投稿記事by WTR » 2021年11月23日(火) 11:21

64 x 39 が横に 6個並んでいると思われるので

これ間違いですね たぶん…

コード: 全て選択

   } else if ($gameVariables.value(4) === 15) {
       var sx = 384;

ここだけ見て 384 幅かと思ってしまったのですが iconSet だから幅 512 で 8個詰めですね きっと


余計なことを書きすぎたかもしれないですね

馬鹿正直に書くとこんなで

コード: 全て選択

   Game_System.prototype.kamonContents = function() {
      if ($gameVariables.value(4) === 1) return {sx: 0, sy: 39};
      else if ($gameVariables.value(4) ===  2) return {sx:  64, sy: 39};
      else if ($gameVariables.value(4) ===  3) return {sx: 128, sy: 39};
      else if ($gameVariables.value(4) ===  4) return {sx: 192, sy: 39};
      else if ($gameVariables.value(4) ===  5) return {sx: 256, sy: 39};
      else if ($gameVariables.value(4) ===  6) return {sx: 320, sy: 39};
      else if ($gameVariables.value(4) ===  7) return {sx: 384, sy: 39};
      else if ($gameVariables.value(4) ===  8) return {sx: 448, sy: 39};
      else if ($gameVariables.value(4) ===  9) return {sx:   0, sy: 78};
      else if ($gameVariables.value(4) === 10) return {sx:  64, sy: 78};
      else if ($gameVariables.value(4) === 11) return {sx: 128, sy: 78};
      else if ($gameVariables.value(4) === 12) return {sx: 192, sy: 78};
      else if ($gameVariables.value(4) === 13) return {sx: 256, sy: 78};
      else if ($gameVariables.value(4) === 14) return {sx: 320, sy: 78};
      else if ($gameVariables.value(4) === 15) return {sx: 384, sy: 78};
   };

計算式ならこんなで

コード: 全て選択

   Game_System.prototype.kamonContents = function() {
      return {
         sx: (($gameVariables.value(4) - 1) % 8) * 64,
         sy: Math.floor((($gameVariables.value(4) - 1) / 8) + 1) * 39
      }
   };

いずれの場合も

コード: 全て選択

$gameSystem.kamonContents().sx
$gameSystem.kamonContents().sy

として2つの値を取りだせます。
Twitter、はじめました。
https://twitter.com/wtr_in_reverie/
アバター
蓮賀まさとき
記事: 26
登録日時: 2020年8月30日(日) 15:00

Re: セーブファイルに表示するアイコン用に、return で一度に 2つの数値(sx, sy)を返す方法を教えていただきたく・・・

投稿記事by 蓮賀まさとき » 2021年11月23日(火) 17:28

WTR様

マウスポインタの件では大変お世話になりました! 今回もご回答いただき、ありがとうございました!

余計なお世話とか、とんでもないです。プラグインやサンプルの画像までご用意いただき感謝です。
逆に情報不足でいろいろとご足労をお掛けしたようですみません(汗)。
(お察しの通り、アイコンは横に8個並べています。もちろん左上は「透明」ガチ保)

さて、教えていただいた方法(とにかく分かりやすかったのと、さらに条件分岐を挿入する箇所が
あるので、“馬鹿正直な” 記述を採らせていただきました)を試してみましたところ、
無事に正しい組み合わせで、また、sx が 0 の場合も問題なく表示されるようになりました!

セーブファイルには、もう一つ各データごとに画像を表示したいと思っておりましたので
大変助かりました。お陰様でスムーズに導入できそうです。

それでは、これにて一件落着! 本件は【解決済み】といたします。
解決策をご教授くださった WTR様、ありがとうございました!
 
添付ファイル
サンプル・ファイル画面-2.jpg
ファイル1 と 3 のアイコンが左端に位置し、sx:0 ですがご覧の通り♪♪
・ツクールは、「触ってる歴」だけはムダに長いです(^^;
・スクリプトは「XP」で興味を持ち、「VX」「MV」でもレイアウトを変更したり、
 画像やテキスト、新たなウィンドウを追加するなど、デフォルトの簡単な応用で
 カスタマイズを楽しんでいます。

“MV:質問” へ戻る