【解決済み】VXの水面と茂みの特徴を掛け合わせるには?

モメット

ユーザー
はじめまして。モメットと申します。以後よろしくお願いいたします。
早速ですがVX(RGSS2)のタイルとスクリプトについて質問させてください。

VXでは水面のタイルがアニメーションをして波打つようになっています。
また、茂みのタイルはキャラクターの足元を少しだけ隠すように透過して、
いかにも草をかき分けて進んでいるように見える演出がなされています。
これらの特徴を掛け合わせれば、波打つ水面に半身をひたすことが、
つまり海やプールやお風呂に入ることができるようになると思います。

もし初期スクリプトに「TileAのこの部分が水面扱い、この部分が茂み扱い」という
箇所があれば、水面を茂み判定の中に組み入れてしまおうと思っていたのですが、
実際には「bushであるならば8ドット透過する」という箇所があったのみで、
どこを水面や茂みとみなすかという肝心な部分が見当たりませんでした。
(顔グラ等には画像のどこからどこまでを顔とみなすかという設定箇所があります)
そこで質問です。
・Tileの水面や茂みを判定する箇所は本当に初期スクリプトに含まれていないのか?
・なかった場合、どんな追加スクリプトを組んだらよいか?
RGSS2にお詳しい方がいらっしゃれば、何卒よろしくお願いいたします。
 
最後に編集:

It's

ユーザー
初めまして、モメットさん。It'sと申します。

ご質問の件ですが、
VXには、bush判定がデフォルトで用意されていますが、水面判定は、
ありませんので、やるとしたらタイルIDで水面のタイルかどうかを
判定するのが良いかもしれません。
しかし、VXでは、タイルIDは、内部で処理されており、
この値は、ヘルプ等にも記載されていないため、
実際の値がどうなっているかは、スクリプトで表示させない限り
分かりません。
いくつかの方法を候補に挙げてみますと、

①タイルIDを調べて、入水判定に使う方法。
サンプルゲームの「レクトールと黒獅子の紋章」のおまけスクリプトに
ExMap_EffectiveTileという、タイルIDを見られるようにして、
ダメージ床などを設定出来るスクリプト素材があります。
それを使って、タイルIDを調べて、それを入水判定に使います。
ただし、今回の場合、水面がオートタイルなので、タイルIDを
すべて調べるのは骨の折れる作業になると思います。
オートタイルは、一つ一つのパターンごとにタイルIDが違うのです。
なので、TileE等のオートタイル以外のタイルの一つを入水判定に
使うためのタイルとして使うのが無難かもしれません。
具体的には、透明のタイルを一つ用意して、水面の上にそのタイルを
敷き詰めます。そのタイルのIDを入水判定に使います。
制作段階で透明にしてしまうと、どこに水面判定があるのか
分からなくなってしまうので、制作段階では何かの色を付けた半透明の
タイルにしておいた方がいいかもしれません。
で、Game_Mapクラスに入水判定メソッドを作成。
Game_Characterクラスのupdate_bush_depthのエイリアスを作って、
入水判定時、bush_depth = 8 にする記述を追記する。
といった感じです。

②エリア設定をする方法。
この方法は、エリアが矩形しか対応していないので、
複雑な形の水場の場合、複数のエリアが必要になりますが、
タイルIDを調べる必要は、ありません。
マップに入水判定エリアを設定し、エリアの名前をwater1、water2…
等にします。
Game_Playerクラスのin_area?メソッドを参考に、Game_Mapクラスで入水判定を
作り、エリアの名前にwaterが含まれるか?等の条件をプラスして、
判定に使います。Game_Character側は、①と同じです。

③イベントコマンドを活用する方法。
お絵描きソフトで、先に下8ドットを半透明にした
キャラグラフィックを用意しておき、
並列処理イベントで、変数にプレイヤーや、イベントのXY座標を入れて、
条件分岐で、XY座標が入水範囲内に入った時、
移動ルートの設定コマンドから、グラフィック変更をするか、
イベントのページを切り替える等して、キャラグラフィックを切り替えます。
入水範囲から出た時に再び元のグラフィックに戻す。
といった感じのイベントを組みます。
多分、フラグがたくさん必要になります(笑)
色々と手間が掛かるし、処理的に重たそうではありますが、
スクリプトをいじらなくても良い方法です。
でも、スクリプトで特定のイベントのセルフスイッチの切り替えを
併用した方が、組みやすいかもしれませんね。

この3つの方法が思い浮かびましたが、
①と②が本当に出来るかどうか試していたら、
普通にスクリプトが出来てしまったので、素材にしてみました。
参考用に作ったスクリプトなので、なにかしらバグが
あるかもしれませんが。
そのまま使って貰っても構いませんし、参考にしてご自分でスクリプトを
組んでみるのも良いかもしれません。
利用規約は、参考用に作ったスクリプトなので、ご自由にお使いください。

追記
一応、以下のサイトでタイルIDは、調べられるみたいですね。
ペンギンの寝床
http://woodpenguin.blog.fc2.com/blog-category-6.html
 

Attachments

モメット

ユーザー
はじめまして、It'sさん。
質問にとても詳しくご返答いただき、ありがとうございます!
その上なんとスクリプトまで組んでいただいて、本当に恐縮です。
素材としても教科書としても大切に使わせていただきます。
おすすめサイトの方も参考にさせていただきます。
重ね重ね、ありがとうございます!
 

It's

ユーザー
どういたしまして。こちらこそ長文失礼しました。
入水判定の時、ペンギンの寝床さんに書いてあるタイルIDを範囲指定する
ようにすれば、入水判定用タイルを用意する必要もないかもしれません。
スクリプトは、確認程度にババっと書いてただけなので、
教科書にするには、バグとか出るかもで怪しいのですが、
参考になれば幸いです。
 

モメット

ユーザー
いえいえ、念願がかなって本当に助かりました。
いただいたスクリプトにはタイルID法とエリア法とがあって、
そのどちらもうまく作動いたしました。
用途によって使い分けることができるので心強いです。
タイルIDには例として768という数値が入れられていましたが、
これはTileEの一番左上の角にあたる番号だったのですね。
すぐ使えるようにという細やかなお心遣い、感謝いたします!
おすすめサイトも伺いました。とても勉強になりました。
ツクールはオートタイルをあのように処理していたのですね。
 

It's

ユーザー
上手く作動したみたいで良かったです。

余談ですが、エリア式の方のin_water?(x, y)のメソッドを
in_water_area?(x, y)等にメソッド名を変更して、
Game_Character側のupdate_bush_depthのエイリアスに、
@bush_depth = 8 if $game_map.in_water_area?(@x, @y) # 入水判定 エリア式
という一行を追加すれば、タイルID式とエリア式、どちらで指定しても
作動出来るように出来るかもしれません。

ペンギンの寝床さんの記事は、自分も今回調べて初めて知った
のですが、VX使ってる人には、ありがたい記事ですね。
不具合などあれば対応すると思いますので、何かあればまたどうぞ。
 

モメット

ユーザー
おっしゃる通りに加筆をしたら、両方とも機能しました。
このスクリプトの中では水の深さもそれぞれ設定できるので、
IDは腰まで、エリアなら肩までといった表現もできますね。
本当に便利なものをいただきました。ありがとうございます!
 

It's

ユーザー
両方作動出来たようで良かったです。
水の深さを変えるというのは、面白いアイデアですね。
どうせならスクリプトも両方作動出来るように
アップデートしようと思って確認していたら、
すみません。やはりバグがありました。
そのままだと乗り物等も透過されてしまうようで、
小舟等は、沈没船になってしまいます(笑)

という事で、バグフィクスついでにスクリプトに
少し手を加えて以下の新機能も追加してみました。
・水面判定用タイルIDの複数指定
・タイルIDごとのbush_depthの指定
また、マップの下層レイヤー、上層レイヤー等を
調べる必要がなくなり、タイルIDの指定だけで良くなりました。
設定項目を設けた事で、スクリプト本体の一部を
書き換える必要がなくなりました。

ちょっと調子に乗り過ぎて複雑になってしまった
かもしれません。説明ばっかで分かりづらいです(笑)
以前のバージョンの方が使い易くて良かったという場合、
以前のスクリプトのupdate_bush_depthのエイリアスの最後に
以下を追加すると、沈没船には、ならなくなります。

# オブジェクト、乗り物、キャラの上のイベント、ジャンプ中は、透過しない。
if object? or self.is_a?(Game_Vehicle) or @priority_type != 1 or @jump_count > 0
@bush_depth = 0
end

利用規約は、以前と同様です。
よろしければ使ってみて下さい。
 

Attachments

モメット

ユーザー
乗り物のことは私もすっかり忘れていました!
It'sさんがスクリプトを段階的にアップデートしてくださったおかげで、
どの部分がどんな意味を持っているのかがよくわかりました。
私は初期スクリプトから不要な部分を削る引き算しかできませんでしたが、
今回のやりとりから足し算の仕方を学べたような気がします。
ありがとうございます。

ver1.1で複数種のタイルIDと深さを設定できるようにしてくださったので、
たとえば子供用プールと大人用プールを表現しわけることもできますし、
川の中にザブザブと入るような本格的渓流釣りゲームも作れそうです。
It'sさんが組んでくださったこのスクリプトは使い道が沢山ありますから、
私以外にも使ってみたいという方がいらっしゃると思います。
広まれ!このスクリプト広まれ!
 
最後に編集:

It's

ユーザー
ありがとうございます。
元々ここまで改変する予定もなかったスクリプトですが、
喜んで頂けて嬉しく思います。
今回の変更は、モメットさんの水深を変えるアイデアを聞いて、
タイルIDを複数指定したり、それぞれに水深(茂み)の深さを
変えられるようにしたら便利かなと思いついたのですが、
使い方によっては確かに面白い事が出来そうですね。
例えば、bush_depthを32にすると完全にキャラが半透明に
なりますが、天井に掛かった柱の下をくぐるような表現が
出来たりします。キャラは、実際には、柱の上を歩くのですが、
半透明化される事で下をくぐっているように見えますね。
隠し通路の表現なんかにも使えそうです。

所で、ツクールVXには、bush_depthの他にbush_opacityという
プロパティがspriteのクラスに用意されています。
これを組み込めば、透過度合いも設定出来るようになります。
参考にbush_opacityを変更出来るスクリプトも作ってみました。
またバグがあるかもしれませんが…

水面bush判定スクリプトと組み合わせて、
bush_opacityを0(完全に透過)にする事によって、ベッドに
入る演出が出来たり、木箱に入るというコミカルな演出が出来たり
するみたいです(笑)

こちらのスクリプトは、単体でも一応、動作しますが、
水面bush判定のようなbush_depthを変えられたりする
スクリプトと一緒に使うのが良さそうですね。
利用規約は、水面bush判定と同様、
参考に作ったスクリプトなので、自由とします。
よろしければ、こちらも合わせて使ってみて下さい。
 

Attachments

モメット

ユーザー
ラッ、ラルフー!?
早速試させていただきました。表現の幅が更に広がっておもしろいです!
VXのベッドは掛け布団のグラフィックがスパッと水平にできているので、
なおのことこのスクリプトとの相性が良いと思います。
PCに限らずNPC(イベント)も指定できるようになっているのがまた便利です。
水の中、ベッドの中、木箱の中、はたまた柱の下を表現しようと思えば、
これまでは専用のキャラチップを準備せざるをえず、キャラ数によっては
膨大な素材数になってしまっていましたが、このスクリプトがあれば
労力をぐっと抑え、自由度を上げることもできるのではないでしょうか。
ありがとうございます!
 
最後に編集:

It's

ユーザー
そうですね。ベッドや木箱に入る等の演出は、
お絵描きソフトで素材改変などしないといけなかったりで、
地味に作業量が増えますが、スクリプトで設定するだけで
表現できるのは、お手軽かもしれません。
あと、特定のタイルに乗るだけで姿を消す事が出来るのも
何かと使えそうな気がします。

スクリプトを作っていて、VXのマップとイベント周りについて、
自分も勉強になりました。VXでは、場所移動等の際に、
イベントがリフレッシュされるようで、イベントにbush_opacityを
持たせても、場所移動でリセットされてしまう事が分かりました。
それでbush_opacityの値の記憶が難しかったのですが、
その点を改善したバージョンを用意しました。
よろしければ使ってみて下さい。
おそらく、これでbush_depth、bush_opacityを大分自由に扱う事が
出来ると思いますので、スクリプトはこの辺で完成でしょうか。

当初の水面のアニメーションタイルをbush判定にしたいという
モメットさんの質問から大分、離れてしまいましたが、
思わぬ発見があって自分も面白かったです。
こちらこそありがとうございました。

バグなどあれば対応すると思いますので、また何かあればどうぞ。
 

Attachments

モメット

ユーザー
質問を投稿させてもらってから1週間、It'sさんには大変お世話になりました!
どなたからもお返事をいただけないことも覚悟していたので嬉しかったです。
問題を解決できたのみならず、良い勉強にもなって、とても助かりました。
ありがとうございます!
毎日この言葉を繰り返すばかりで恐縮なのですが、本当に感謝しています。
いつかこのご恩をお返しできるように頑張ります。
 
トップ