点線上の文字の羅列 RPGツクールVX講座特別編.マップにゲージを表示する

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

RPGツクールVX講座特別編.マップにゲージを表示する

ついさっき拍手でコメントをいただきました。
「変数をゲージで表示するにはどうするの?」と。

そう、いつものfaidaは暇を持て余したので講座を始めたのです。

まあでもこれ、「気に食わない機能の改造」じゃないので、特別編として講座を始めたいと思います。

名前出していいかどうかわかんないんで、まあその、コメントくださった方、やる気の無い私に火をつけてくださり、誠にありがとうございます。


あと前回言い忘れたけど、2Dアクションのver1.1をそろそろ公開したいと思います。
内容は全体的なバランス調整とか新機能追加とかです。
特筆すべき箇所?あー……「個別道具袋」「フォロワーのイベント起動」「ゴッドイーター」で。どうだろうか。

gauge_in_map.jpg
はい。こちらが完成形となります。

ゲージの作り方は意外と簡単です。
①ウィンドウを作る
$window = Window_Base.new(x, y, width, height)
今回は$windowというグローバル変数を使用します。まあ名前は何でもいいです。
xにはx座標、yにはy座標、widthにはゲージの長さ+32、heightにはゲージの高さ+32を指定します。この+32というのが非常に重要です。

こちらの画像をご覧下さい。
name_window.jpg
見たまんま私の名前ですが、問題はそこじゃなくて、WindowsXPのペイントで描いた赤い矢印の方です。
この赤い矢印の部分は通常「描画できない領域」となっています。まあ見た目きれいにレイアウトしたいので多分こうなってるんでしょう。
この矢印の長さは一本16ピクセルとなっております。それが上下左右(右は面倒だったのでカット)に一本ずつあるので、合計32ピクセルは描画できない領域となっております。
なので+32としたわけです。ここを覚えておくと、スクリプトを自作した時に文字がはみ出る……なんて不具合を回避できます。まあそんなことをする方は多分いらっしゃらないでしょうがね(超失礼)

②ウィンドウの枠と背景を消す
$window.opacity = 0
opacityというのはウィンドウの枠(と背景)の透明度です。これを0にすると枠(と背景)が消えます。
通常は255になってますが、まあそんなことはどうでもいいですね。

③黒い四角を作る
$window.contents.fill_rect(0, 0, width, height, Color.new(0, 0, 0))
ゲージって実は「色の付いた四角」と「黒い四角」の二つで作られているんですよ。これを一本だと思っていた方は少しだけ反省してください。
まあその黒い四角の方を作ります。widthにはゲージの長さ、heightにはゲージの高さを指定してください。

④色の付いた四角を作る
w = $game_variables[n] * width / max
$window.contents.fill_rect(0, 0, w, height, Color.new(red, green, blue))

「w = 」の式で色の付いた四角の長さを作ってます。理屈は「変数nの最大値に対する割合に、ゲージの最大の長さを掛け算する」ってことで、まあ要するにゲージの長さの何%の長さにするってそれだけです。
なんで割り算のほうを先にしないかと言いますと、実はRubyだと整数同士の計算結果を小数に変換することはできないんですよ。なのでゲージの長さの方を先に乗算してしまう。
あ、すっかり忘れてましたけど、nには変数のID、widthにはさっきの黒い四角の長さ、maxには変数の最大値をいれてくださいね。

でまあ、四角をもう一個作ると。蛇足ですが、このfill_rect(ちなみにBitmapのメソッドです)というのは「四角の範囲をある一色で塗りつぶす」というメソッドなんですね。
「えー、俺HPみたいに二色を混ぜたみたいなゲージ作りてーよ」っていう我侭な方にはgradient_fill_rect(x, y, width, height, color1, color2)というメソッドがありますので、こちらをお使い下さい。こっちは色を二個指定しないとエラーでますよ。
さっき説明しなかったんですが、Color.newの引数ですね、順に「赤、緑、青(、グレー)」となっております。適当に混ぜて作ってください。ちなみにお気に入りの色はSFC版FF5の標準ウィンドウカラー(0,0,128)です(何)

⑤数値(文字)を入れてみる
$window.contents.draw_text(0, 0, width, height, $game_variables[n])
draw_text(何度も言いますが、「Bitmap」のメソッドですからね?)で文字を描画できます。fontを色々いじくると、文字色とかサイズとか書体とか変更できますが、今はそんな事は重要ではないので省きます。

⑥完成……?
まあそんなわけないですね。
しばらく放っておくと消えます。これはGC(ガベージコレクト)といって、更新が行われていない不要な画像を消す機能があるためです。
ですので、コモンイベントの並列処理でしっかり更新しましょう。

というわけでなんやかんや詰め込んだのがこちらのコモンイベントになります。window_update.jpg
とりあえず$windowがnilならウィンドウ作成モード、それ以外はウィンドウ更新モードにしました。で、本来なら不要な$window.back_opacityを変数の保存場所にして、変数の内容が変わった時のみウィンドウを作り直します。まあウィンドウを作り直すんじゃなくて、その中身(content)を作り直す(contents.clear)べきなんですが、日付も変わりそうですし、面倒臭いので勘弁。
あとゲージの色はなんか毒々しい色になってますがそれもご愛嬌ってことで。

どうでしょうかね。結構こういうシステムを使いたいって方が多いんじゃないですかね。
というわけで今回は「イベントコマンドだけで作れる!マップにゲージを表示させる方法」でした。あれ?そんなんだったっけか?
次回もお楽しみに!
スポンサーサイト

コメントの投稿

非公開コメント

No title

すいませんこれで表示した変数のサイズをもう少し大きくしたい場合はどうすればいいでしょうか?

No title

こんばんは、faidaです。
フォントの大きさを変えるのは$window.contents.font.size = nとなります。
nにはお好みのサイズを入れてください。
また、それにあわせてウィンドウの大きさをあらかじめ大きくしておかないと、文字が見切れてしまう場合があります。

ちなみに、フォントの色も$window.contents.font.color = Color.new(red, green, blue)で変えられます。
白とか黄色いゲージで白い色のフォントが見づらい場合はこちらで変更してください。

No title

こんばんは、VXAceでの使用出来るので、とても助かります
MAP上でゲームオーバーやタイトルに戻るとやった場合
画面上にゲージが残ってしまうのですが、どうやって消せばいいのでしょうか?

Re:

おはようございます、faidaです。
ウィンドウを消すこと自体は$window.disposeで出来ますが、今回の場合イベント以外でもゲームオーバーやタイトルに戻る可能性があるはずです。
そこで、考えうる全てのシーン遷移において、スクリプトエディタ上で$window.dispose if !$window.nil? && !$window.disposed?としておくといいかもしれません。
例えばScene_Mapの「画面切り替えの実行」で、「プレイヤーの移動中?」のすぐ下に
if $game_temp.next_scene
$window.dispose if !$window.nil? && !$window.disposed?
end

と挟んでやると、切り替え処理の前にウィンドウを消してくれます。

まあイベントだけならエディタ上では(ゲームオーバーやタイトルに戻るイベントコマンドの前に入れればいいだけですし)必要がないのでアレですが。

No title

こんばんは、ラテスカです
丁重な説明、助かります
おかげで、ゲームオーバー、タイトルに戻るをした時に問題なく消えました
ありがとうございます

No title

おはようございます
これを使わせてもらってHPを表示させようと思っているのですが

この通り書いて実行すると
undefined method `fill_rect` for nil : NilClass

とエラーが出てしまいます

fill_rectというメソッドが見つからないということなのでしょうが、当方初心者のため解決策がわかりません

大変恐縮ですが、解決策がお分かりであれば教えていただけないでしょうか

Re:

おはようございます、faidaです。
nilクラスということは、その指定した変数が生成されていないために起こるエラーです。
スペルミスなどをご確認の上、もう一度作ってみてください。
($windowsなどのミスが考えられます)

No title

小松です

ドットがコンマになっている箇所がありました
助かりました!ありがとうございます!

No title

度々申し訳ありません

一度ゲージを$window.disposeで消してから、もう一度表示させようとすると

disposed window

というエラーが出てしまいます。
例えば一度タイトルに戻ってから、再度ニューゲームをした場合です。
この場合、特別な処理が必要だったりするのでしょうか

Re:

次の記事とか、ここのコメント欄とかに書いてある方法を試してみてください。
特に、次の記事にはバグ修正があるので、多分原因はそれじゃないかなと思ったりします。

ゲージ描画について

はじめまして、こんばんは。
変数の値をゲージとして、マップに表示する方法を探していて、こちらに辿りつきました。
素敵な講座をありがとうございます!

そこで、質問があるのですが、マップにゲージを表示してみたのですが、ゲージがなかなか消えずに困っています。

$window = Window_Base.new(170, 295, 212, 50)
$window.opacity = 0
$window.contents.fill_rect(0, 0, 180, 18,
Color.new(0, 0, 0))
w = $game_variables[18] * 180 / 100
$window.contents.fill_rect(0, 0, w, 18,
Color.new(0, 200, 150))
$window.contents.draw_text(170, 295, 180, 11,
$game_variables[18])

として、変数18番の値をゲージ描画しているのですが、どこが悪いのか、すぐ消えてくれません。

$window.dispose
を使っても、何故か数秒消えずに残ってしまいます。
最終的には消えてはくれるのですが…。

初心者的質問で申し訳ありません。

お忙しい中、大変失礼します。
ご教授いただけると嬉しいです。

Re:ゲージ描画について

こんばんは、faidaです。
簡単な方法としては「消す前に見えなくする」というのがあります。
$window.visible = falseとやると、非表示状態になります。
この後に$window.disposeを実行してください。

なお、消えるまでにタイムラグがあるのはGCが行われるまでに時間がかかるためです。
GC.startを実行するとすぐにGCが行われるので、これでも消すことができそうです。

お早い回答をありがとうございます。

faida様
早速のご返信ありがとうございました。
GC.start
とした所、思った通りの挙動になりました。
当方RPGツクールのACEを使っていますが、ACEでも使えて、RGSS3を使わないでも、ゲージが表示出来るってすごいですね!
回答ありがとうございました!

敵HPゲージ表示

お世話になっています。

昨日コメント投稿させていただいたのですが、途中エラーで送られなかったような感じなので。

最近、アクションRPGを作っているのですが、フィールド上の敵にHPゲージを表示をさせたく四苦八苦しています。海外も見てはみたのですが・・・スクリプトを探してもよくわからず。

このコモンイベント使用の方法で、フィールド上の敵にHPゲージ表示させることは可能でしょうか。
よろしくお願いします。

Re:敵HPゲージ表示

こんにちは、faidaです。
敵のHPがどういう風に作られているのかは分かりませんが、
「④色の付いた四角を作る」で
w = $game_variables[n] * width / max
という表記がありましたよね。
この$game_variables[n]を敵のHPに変更すればよいだけです。
同じようにmaxも敵の最大HPに変更すればできます。

とにもかくにも「敵のHP」をどうやって作っているのか分からないので
私がアドバイスできるところはこんな感じですかね。

ウィンドウの表示優先

はじめまして。
マップでのHPゲージ描画方法を探してここに辿り着きました。
もう2年以上前の記事ですが、問題が発生しましたのでコメントさせていただきます。

この記事と次の記事に書かれている方法はすべて試し、ゲージの描画には成功したのですが、その状態でメニューを開くと、「アイテム」「スキル」を開いた場合のみゲージがウィンドウより上に描画されてしまいます。
(新規作成した直後のゲームで確認しました)

ウィンドウのZ軸の問題と考え、$window.z = 0 の一文を入れてみると現象は発生しなくなりましたが、今度は場所移動などで頻繁に(おそらくスプライトの更新タイミング)でゲージが消えてしまうようになりました。

何かこの問題をスマートに解決する方法はございませんでしょうか。
(メニュー開閉時にゲージを表示非表示するという手は考えましたが、それ以外で解決策があればお願いします)

結構目につく問題なのに誰も指摘されていないことを考えると、環境依存かもしれません。
PCのOSはWindows7で、ツクールはVXです。(Aceではないです)

お暇な時で構いませんのでご確認いただければ幸いです。

Re:ウィンドウの表示優先

はじめまして、faidaです。
現在VXを使用できない状況であり、Aceでは「アイテム」「スキル」を開いても同様の結果を得ることができませんでした(余談になりますが、コモンイベントが起動している可能性があります)。
$window.z = 0 の現象はAceでも確認できましたのでこちらの対策を紹介します。

以前何らかの対策に使ったもの(用途不明)ですが、
$window.contents_opacity = screen.brightness$window.updateの下に導入すると対策できるようです。
VXでも使用できるコマンドであることは確認しましたが、効果があるかどうかまではわかりません。

私がVXを使用できるまではとりあえずこちらをお試しいただければと思います。

ウィンドウの表示優先

回答ありがとうございます。

$window.contents_opacity = screen.brightness
を試しましたが、特に現象は変わりませんでした。

しかし、返答を書き込んでいる間に「スプライトを再作成している箇所の直後にHPゲージの描画処理を入れる」という案をひらめき、実装したところひとまず理想的な表示ができましたので、これで行こうと思います。

お手数をおかけした上に自己解決してしまって申し訳ありません。
ただ、やや強引な処理であり根本的な解決とは言い難いので、再び質問させていただくかもしれません。その時はご教授いただけると幸いです。

ありがとうございました。
プロフィール

faida

Author:faida
VX/VXAceスクリプト担当。デレステP。担当の限定は逃す派。創作ブログの名の下に、デレマスSS書こうかな。

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
アクセスカウンター
投票
ついったー
検索フォーム
メールフォーム

名前:
メール:
件名:
本文:

RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。