[VX] タイルセットをマップごとに設定する

タイルセットA~Eだけではマップの表現が間に合わない時、
特定のマップにだけ特別なタイルセットを使用したい場合が
あります。

VX標準システムでは、RTP標準のタイルセットかどうかに
関わらず、一度決定したタイルセットはゲーム中に変更する
ことはできませんが、今回のスクリプト改造によりこれを
可能にしました。

画像


スクリプト素材のダウンロードは↓
http://www.lm-t.com/blog/rep_tileset_110.zip

[2014/03/28追記]
不具合を修正しました。(Ver 1.10)
機能追加を行いました。(Ver 1.10)

[2011/07/02]
機能説明の一部に誤りがあったため、修正しました。


-----機能説明ここから-----
■仕様■
1.機能概要
 タイルセット置換スクリプトは、ゲーム中に動的にタイルセットを
 置き換えることができるようにし、マップに使用できるタイルの数を
 理論上無制限にするものです。


2.タイルセットの置換方法
 タイルセット置換スクリプトを導入しても、使用するタイルセットを
 明示的に指定しなければ、従来通りRTPのタイルセットを読み込もうと
 します。

 タイルセットを置換するには、マップ名に拡張オプションを記述して
 明示的に指定します。拡張オプションの詳細については、
 拡張オプションスクリプトの記事を参照してください。

 以下に記述例を記載します。

 ・フィールド
  タイルAにFieldSea.png, FieldGround.pngを、
  タイルBにFieldB.pngを使用する。

 ・廃村
  タイルAにOldHouse.png, OldWall.png, OldChipsA.pngを使用する。

 ・船内
  タイルEにShipE.pngを使用する。
 
画像

 上記のように、マップごとに使用するタイルセットを明示的に
 指定します。明示的に指定されなかったタイルセットはRTPの
 タイルセットが自動的に選択されます。

 明示的に指定したタイルセットは、「Graphics/System」フォルダに
 格納しておいてください。


3.通行設定の置換
 タイルセットのみを明示的に指定しても、通行設定はVXエディタ上で
 編集したものが使用されてしまいます。指定したタイルセット専用の
 通行設定を使用したい場合は、テキストファイルに通行設定を
 記述します。

 (1) ファイル名
  通行設定のファイル名は、タイルセットのファイル名に
  「Passage」を付加したものにしなければなりません。
  例えば、タイルセットのファイル名が「MyTileset.png」の場合、
  通行設定ファイル名は「MyTilesetPassage.txt」とします。
  通行設定ファイルの格納先フォルダはタイルセットファイルと
  同じです。

 (2) 記述内容
  通行設定ファイルへの通行設定の記述例を以下に記載します。

  [o][o][x][x][*][x][o][*]
  [o][o][o][x][x][*][*][o]
  ...続く

  つまり、VXエディタ上に表示されたタイルセットと同じ位置に該当する
  タイルの通行設定を記述します。
  タイルセットの種類により、定義しなければならない通行設定の数が
  決まっています。

  A1 → 2段
  A2 → 4段
  A3 → 4段
  A4 → 6段
  A5 → 16段
  B → 32段
  C → 32段
  D → 32段
  E → 32段

  通行設定の設定内容の意味を以下に記載します。

  o → 通行可 (歩行・飛行船着陸可)
  x → 通行不可
  * → 通行可 (キャラクターがタイルの後ろに隠れる)

  [Ver1.10以降]
  w → 海・水 (小型船・大型船のみ通行可)
  d → 深海 (大型船のみ通行可)
  f → 森 (歩行のみ可)
  b → 茂み (歩行のみ可)
  c → カウンター
  m → 歩行のみ可 (飛行船は着陸不可)

 (3) 注意点
  通行設定ファイルは、マップの読み込み時にファイルから読み取られ、
  書式のチェックが行われます。ファイルへの記述内容が以下のような
  状態になっていた場合、実行時エラーが発生し、ゲームが強制中断
  されますので注意してください。

  ・1行に8個分より多くの通行設定を記述している。
  ・1行に8個分より少ない通行設定しか記述していない。
  ・規定より多くの通行設定を記述している。
  ・規定より少ない通行設定しか記述していない。
  ・通行設定に不明な文字を使用している。

 通行設定ファイルは無くても構いません。
 通行設定ファイルが無い場合は自動的にVXエディタで編集した通行設定が
 選択されます。


4.VXエディタでマップを編集するにあたって
 VXエディタ上では、使用するタイルセットを動的に読み込み直すことが
 できない仕様になっています。そのため、想定するタイルセットを
 VXエディタ上に表示してマップを編集するには、一定の手順に従って
 VXエディタに想定するタイルセットを読み込ませなければなりません。

 以下にVXエディタ上に想定するタイルセットの読み込み直しをさせる
 ための手順を記載します。

 例:「CustomTile.png」をタイルEに使用したい場合

 (1) CustomTile.pngをTileE.pngにリネームする。
 (2) リネームしたTileE.pngを「Graphics/System」フォルダに格納する。
 (3) VXエディタ左下のマップ一覧で、表示中のマップ以外を選択する。

 上記手順を実施することで、TileEにCustomTile.pngが読み込まれます。
 目的のマップの編集が終わったら、TileEを削除してテストプレイで
 編集したマップの確認を行ってください。


5.その他の注意点
 (1) ビデオメモリ容量について
  一度読み込まれたタイルセットはゲームが終了するまでビデオメモリ上に
  キャッシュされます。そのため、あまり大量のタイルセットを使用すると
  ゲームの動作に必要とするビデオメモリ容量が増加します。

  タイルセットは、枚数ができるだけ少なくなるよう計画的に
  使用することをお勧めします。

  タイルセットに使用されるビデオメモリ容量は、一枚あたり1MBを
  目安に想定すると良いと思います。


■導入手順■
1.導入前の準備
 このスクリプトは

 ・拡張オプションスクリプト

 上記スクリプトを最初に導入しておいてください。
 すでに導入済みの場合はこの作業を省略できます。


2.スクリプトの追加と置換
 (1) 置換
  以下のスクリプトの内容を書き換える作業を行います。

  Game_Map.txt       → Game_Map
  Spriteset_Character.txt → Spriteset_Character
  Spriteset_Map.txt    → Spriteset_Map

  上記で示したスクリプトに、以下のコメントで囲まれている部分を
  手動で追加してください。

  #T14-031 ADD--->
  #<--------------
  #T14-031 1.10 ADD--->
  #<-------------------

  以下のコメントで囲まれている部分を手動で変更してください。

  #T14-031 CHG--->
  #<--------------

  以下のコメントで囲まれている部分を手動で削除してください。

  #T14-031 DEL--->
  #<--------------

  変更する箇所を間違えないように注意してください。

 ●注意
 置換作業を行う前に必ずバックアップを取っておくようにしてください。
 元のスクリプトの状況によっては、置換を行うことでスクリプトが
 正常に動作しなくなることがあります。
-----機能説明ここまで-----

ブログ気持玉

クリックして気持ちを伝えよう!

ログインしてクリックすれば、自分のブログへのリンクが付きます。

→ログインへ

なるほど(納得、参考になった、ヘー)
驚いた
面白い
ナイス
ガッツ(がんばれ!)
かわいい

気持玉数 : 7

驚いた 驚いた 驚いた 驚いた
ナイス ナイス
ガッツ(がんばれ!)

この記事へのコメント

しろがね
2012年06月30日 01:32
初めまして、突然のコメントお許し下さい。
こちらのスクリプトは非常に重宝しております。いつもありがとうございます。
この度こちらの記事のタイルセットをマップごとに~スクリプトを導入させて頂きました。
歩行設定をタイルセットごとに指定できるところは探し求めていた唯一の機能でしたので、本当に助かっております。

ただ、私はゲーム上にて現在地のマップ名を表示するようにしているのですが、マップの設定にて
フィールド
と記述したものが、ゲーム上でも全文そのまま現在地として表示されてしまいます。
ゲーム内で現在地のマップ名を呼び出した時、<>で囲まれた指定タグ部分だけ非表示するようには出来ないでしょうか?
お手数お掛けしますが、ご検討お願いいたします。
J-SON
2012年07月03日 23:56
初めまして。
返事が遅くなり済みません。

お問い合わせの件ですが、代替の方法を試そうとしたところ、ツクールをインストールしているPCが壊れてしまいました…

現状の仕様では、仰る通り<>も含む文字列がマップ名として扱われるため、代替の方法が無い状況です。前向きな回答ができず済みません…m(_ _)m
しろがね
2012年07月04日 22:45
ご返信ありがとうございます!
PC大丈夫ですか?復帰できることをお祈りしております。

そうですか…
他のサイト様のものになってしまい申し訳ないですが、某KGC様のタイルセット拡張スクリプトもマップ名にタグを入力して使用するもので、そのスクリプト内にタグの部分だけ非表示するような記述がありましたので、もしかしたら可能ではないかと思ったのです。
スクリプトをお借りし、お願いしている立場から言えることではございませんが、PCが直って、余力があればで構いませんので、何か検討して頂けると幸いです。
大変なこととは思いますが、今後とも応援しております。
しろがね
2012年08月09日 14:52
こんにちは。
三度目のコメント申し訳ありません。
また上記の<>内を非表示にしたい件についてです。
あれから素人なりに考えてみたのですが、マップを表示しているスクリプトの方で<>内を非表示するように手を加えると、こちらのタイルセット置換そのものが機能しなくなってしまうようです。
因みに非表示の命令は以下です。

class RPG::MapInfo
def name
return @name.gsub(/\<.*\>/) { "" }
end
def original_name
return @name
end
end

<>内をゲーム内では見えないように、こちらのスクリプト内で設定できませんでしょうか。
…一度はお断りされているものを、また押し付けるような形になってしまい、申し訳なく思っております。
ですがどうしてもこちらのスクリプトが気に入っておりますので、もう一度検討して頂けないかと思いコメントしてしまいました。(先日はPCが壊れて試せない、との回答でしたので…)
不快に思われましたら重ね重ね申し訳ございません。
難しいようでしたら、これ以上無理は言いません。
お忙しいところ、失礼致しました。
J-SON
2012年08月10日 00:18
こんばんは。

PC環境も無事復旧しました。長らくコメントを放置してすみませんm(_ _)m
<>内を省いた名称を抽出する件ですが、取り急ぎサンプルを作成してみました。

■Ex
(1)Exモジュール内の任意の場所に以下を追加
@@org_name_part = /([^<]*)/m
def self.parse_org_name(str)
@@org_name_part =~ str
return $1.to_s
end

(2)RPG::MapInfoの定義を以下のように書き換え
class RPG::MapInfo
attr_accessor :exop
attr_accessor :org_name
end

■Scene_Title
(1)load_exopsの最終行に以下を追加
$data_mapinfos.values.each {|o| o.org_name = Ex.parse_org_name(o.name) if o != nil}


上記のコードを手動で追加して頂き、RPG::MapInfo.nameを参照している箇所(load_exopsは例外)をorg_nameに変更してみてください。

軽く動作確認はしましたが、もしかしたらエラーが発生するかもしれません…。非公式ということで悪しからずご了承ください。

よろしくお願いします。
しろがね
2012年08月10日 23:31
お忙しいところ、素早く応えて下さってありがとうございます。
その誠意に感謝致します。

サンプルを導入してみたのですが、Scene_Titleに追加した行でNoMethodErrorが発生しました。
「#メモから拡張オプションを読み込むデータ」内、「end」の上に挿入しましたが合っておりますでしょうか。
また、「RPG::MapInfo.nameを参照している箇所」の見落としがあるかもしれないのですが、こちらはマップ名を表示しているスクリプトのみの変更で合っておりますでしょうか。(因みに某ちいさな本屋様のMeLTを使用させて頂いております)

自分はスクリプターではないので、理解力が乏しく申し訳ないです。お手隙の時にでももう少しお付き合い頂けると非常に助かるのですが、勿論気が向いたら、で十分です。
何度もお手数お掛けしてすみません。
宜しくお願いします。
J-SON
2012年08月11日 01:25
こんばんは。

NoMethodErrorでピンときたのですが、もしかしてExの(1)を「module Ex ~ end」の外側に記述していませんでしょうか?

parse_org_nameは、Exモジュールのメソッドとして定義する必要があるので、もし、上記の状況が当てはまるようでしたら、module Exの中にparse_org_nameを記述するように修正してみてください。

後から読むと、私の説明も少し誤解を招く書き方をしていたようです…。
しろがね
2012年08月11日 02:29
素早い返信ありがとうございます。
ご指摘頂いた問題ですが、全くその通りでした…
Exの「module Ex」内、一番上に挿入してみましたところ、問題なく動作しました。
結果、タイルセット置換が働いたまま、<>内の記述のみを表示中のマップ名から消すことが出来ました。
ありがとうございます!
暫く私の我儘に付き合って頂き、色々とご面倒・お手数をお掛けしました。
今後ともスクリプトの更新を楽しみにしております。

この度は本当にありがとうございました!
銀月
2014年08月15日 00:01
こんにちは~
あの...説明とおりこのスクリプトを導入しましたが、こんなエラーが出てきてしまいました:
undefined method `[]' for nil:NilClass
問題の部分はこちらです:
options = $data_mapinfos[@map_id].exop
何とかしてあげたいですが、失敗しました...
ですから協力を求めにきました~
お願いします!
J-SON
2014年08月15日 10:19
>>銀月様
こんにちは。
エラー内容から察するに、拡張オプションの導入忘れか、一部ファイルへの導入漏れの可能性があります。

拡張オプションスクリプト導入済みであれば、Game_Mapへの変更に漏れが無いかご確認いただけますでしょうか。

よろしくお願いします。
銀月
2014年08月15日 21:52
早速の返事ありがとう!
今日考え直して、もしかしたら
他のサイト様のスクリプトとうまく会わないかもしれません。
念のため、新たなプロジェクトでやり直しました。
でも...新たな問題が...=w=
→failed to create bitmap
問題の部分:
Cache
@cache[path] = Bitmap.new(path)

Game_Mapへの変更は"#T14-031"と記事された4箇所も全部確認しました。
うぅ...
J-SON
2014年08月15日 23:26
あまりはっきりしたことは覚えていませんが、そのメッセージは確か、必要な画像ファイルが適切なフォルダに無いか、画像ファイルが壊れている場合に出た記憶があります。

また、画像ファイルと同じ名前で、拡張子だけが異なるファイルが同じフォルダに存在する場合にも発生する可能性があります。
銀月
2014年08月16日 23:56
また...失敗です
ま、時々こんなこともありますね。
どうしても無理そうなので、
放っておきます。
邪魔してすみません~
色々ありがとうございました!
RedPilot
2017年01月18日 17:38
お世話になります。
突然かつ今更で大変申し訳ありませんが、
2014/08/15の銀月さんのコメントにある

> undefined method `[]' for nil:NilClass
> 問題の部分はこちらです:
> options = $data_mapinfos[@map_id].exop

の件は他のコメントにも見当たらず、
現在いかがでしょうか?

もしよろしければ、ご返信ください。

この記事へのトラックバック