2012-08-23

RGSS-HP・SPゲージ表示

«RGSS一覧

数値だけでなく、視覚的にHPやSPの増減を表現したい!
そう思う人も少なくはないはず。
なので今回はHP・SPゲージの作成方法を教えます。

画像いらずの表示方法(塗りつぶし)と、
画像で表示する方法があるので
自分に合った表示方法で作りましょう。



【今回の変更点】
・Window_Base

【スクリーンショット】
スクリプトの「塗りつぶし」で作成したHP・SPバー。
残量によって色が変化するようにしている。画像を用意する必要がないので手軽に作れる


グラデーションした画像を使用したHPバー
後ろは上のスクリーンショットと同じく塗りつぶしで表示




■Window_Base


支障がなければ(どちらの表示の仕方も)
「HP の描画」「SP の描画」に追加するだけです。

以下、描画のみの画像いらずバージョンです。

base_color = Color.new(赤, 緑, 青, 透明度)
hp_color = actor.hp <= actor.maxhp / 4 ? Color.new(200, 0, 0) :
actor.hp <= actor.maxhp / 2 ? Color.new(200, 200, 0) : Color.new(0,0,200)
self.contents.fill_rect(横位置, 縦位置, 横幅, 縦幅, base_color)
self.contents.fill_rect(横位置, 縦位置, actor.hp * 横幅 / actor.maxhp, 縦幅, hp_color)

spの場合はactor.hp、maxhp
actor.sp、maxspに変更するだけです。

base_colorでの表示はゲージの後ろの方…
HPやSPが減ったら見える部分です(・ω・)
スクリーンショットを見ていただければ多分、わかると思いますが。

それから、上記の例では最大HPの1/2になると黄色に
1/4になると赤色にメインゲージの色が
変化するようになっています。
こちらもスクリーンショットを参考にしていただければ。

ちなみに上のスクリーンショットに写っているゲージですが
base_colorの縦幅・横幅をメインより+2して、
メインの縦、横位置に+1してベースで
ゲージに「囲い」みたいになるように作っています。
いらなかったらそのままでいいと思います。


以下は、画像使用バージョンです。

bitmap = Bitmap.new("Graphics/Pictures/HP・SPゲージ用画像名")
src_rect = Rect.new(0, 0, actor.hp * bitmap.width / actor.maxhp, bitmap.height)
self.contents.blt(横位置, 縦位置, bitmap, src_rect)

後ろの黒い部分(画像素材なしのベースカラー部分)を
作りたい場合は、描画のみバージョンのベースゲージ参照。
メインと同じく画像で表示させるのもいいかと思います。

どちらも計算は
現在のHP×横幅÷HP最大値
これで減ったらHPの%分減り、増えたら増えます。



画像表示は必ず、後ろに表示させたいものから
記述してあげる必要があります。

例えば、

前に表示したいメインゲージ
後ろにするベースゲージ

の順番だと、ベースバーがメインゲージに被ってしまいます。

被る、といえば。
ダメージの表示位置がデフォルトのままだと
HP・SPゲージがダメージに被さってしまって
見辛い状況になる可能性があります

なので以前書いた記事の
アローカーソル・ダメージ表示修正」のように
ダメージの表示にビューポートを通さないようにすると見やすくなるかと思います。
参考までに。



★このスクリプトを使った関連作品


category:
2012-08-21

RGSS-アローカーソル・ダメージ表示修正

«RGSS一覧

ダメージ、アニメーション、アローカーソルは
「Spriteset_Battle」で作成したビューポートに反映するようにして表示しています。
アクター、共にエネミーのビューポートはどちらも
バトラーグラフィックと同じ奥行きに設定されています
エネミーの場合はHPなどのステータスがグラフィックに被る事がないので問題ありませんが
アクターの場合ですと、ステータスの表示をするため
ダメージなどの表示がステータスの文字に隠れてしまいます

そんなわけで、今回はその応急処置として
ビューポートを通さないようにしたり、
新しくビューポートを作成して反映させます。




【今回の変更点】
・RPG::Sprite(追加)
・Spriteset_Battle
・Scene_Battle 3




以下ダメージ表示修正


■RPG::Sprite

RPG::Spriteの貼り付け方法などについては以前の記事
ダメージ文字・動作変更」に書いてありますので参考にしてください。

クリティカル文字などの
ダメージ表示系のものが書かれているところ。
クリティカル文字設定(if critical~end)の丁度下。
(self.viewport)になっているところをnilに変更。
@_damage_sprite = ::Sprite.new(nil)

あとはxyなどで位置を微調整するだけです。

以下アローカーソル修正


■Spriteset_Battle

「公開インスタンス変数」
attr_reader :viewport5
「ビューポートを作成」
@viewport5 = Viewport.new(0, 0, 640, 480)
@viewport5.z = 200

z値はステータスよりも上に。デフォルトなら102以上。

■Scene_Battle 3

「アクター選択開始」の「アクターアローを作成」
青文字のように変更します。
@actor_arrow = Arrow_Actor.new(@spriteset.viewport5)



「こういった変更が面倒だ!」という場合は
アクターのビューポートをステータスと被らないように位置を変更したり、
いっそアクターにバトラーグラフィックを使わないという手段もあります(・ω・`)

category:
2012-08-07

RGSS-セーブデータ消去モード追加

«RGSS一覧


ゲーム内でもセーブデータが消去できるように
セーブ・ロード画面から「データ消去モード」に切り替わるようにします。




【今回の変更点】
・Scene_File



■Scene_File

「C ボタンが押された場合」以下
青文字部分を追加します。
if Input.trigger?(Input::C)
 if @delete == true
  $game_temp.last_file_index = @file_index
  # ファイルが存在しない場合
  unless FileTest.exist?(make_filename(@file_index))
   # ブザー SE を演奏
   $game_system.se_play($data_system.buzzer_se)
  else
   File.delete(make_filename(@file_index))
   @help_window.set_text("消去しました")
   @wait_count = 20
   loop do
    @wait_count -= 1
    Graphics.update
   if @wait_count <= 0
    break
   end
  end

  @delete = false
  # メソッド on_cancel (継承先で定義) を呼ぶ
  on_cancel
  return
 end
else

 # メソッド on_decision (継承先で定義) を呼ぶ
 on_decision(make_filename(@file_index))
 $game_temp.last_file_index = @file_index
 return
end
end
# B ボタンが押された場合
if Input.trigger?(Input::B)
 if @delete == true
  @help_window.set_text(@help_text)
  @delete = false
 else

  # メソッド on_cancel (継承先で定義) を呼ぶ
  on_cancel
  return
 end
end
if Input.trigger?(Input::F5)
 if @delete == true
  @help_window.set_text(@help_text)
  @delete = false
 else
  @help_window.set_text("消去する記録を選んでください")
  @delete = true
 return
 end
end

@deleteがtrue(消去モードON)の時、
決定ボタンを押すとデータ消去。
消去モードON時にキャンセルボタン、
またはモード変更ボタン(ここでは仮にF5ボタン)を押すと
消去モードがOFFになる仕組みです。

モード変更ボタンは
あまり間違って押してしまわないようなボタンが
好ましいかと思います(´・ω・`)




パソコン初心者だけどゲームで遊びたい。
そんな人向けに、と思ってこういった機能を作ってみました。
あまり(プレイヤーが)直接フォルダの中身をいじらずに、ゲーム内でいらないデータを消去できた方がわかりやすいかな。と。

幅広く多くの人に遊んでもらえるような
そんな親切設計のゲームが作りたい今日この頃です。
…理想、ですけどね(笑)

category:
2012-08-02

RGSS-魔力依存アイテム

«RGSS一覧

アイテムの効果は、
回復率・回復量・命中率・物理防御・魔法防御・分散度
で設定します。

そのまま、攻撃系アイテムを作るなら
ゲーム進行でどんどん敵が強くなるわけですから
回復率で調整すれば攻撃アイテムとしてよく機能します。

が、今回は「使用者の能力に見合った効果がほしい!!!」
という人向けに使用者の能力がアイテムの
回復量・ダメージ量に影響を与えるようにします。



【今回の変更点】
・Game_Battler 3
・Scene_Item
・Scene_Battle 4




■Game_Battler 3

青文字部分を追加します。

def item_effect(user, item)
「回復量を計算」より少し下
if recover_hp < 0
 user == 0 ? nil : recover_hp -= user.int
 recover_hp += self.dex * item.pdef_f / 20
 recover_hp += self.int * item.mdef_f / 20
 recover_hp = [recover_hp, 0].min
else
 recover_hp == 0 ? nil : user == 0 ? nil : recover_hp += user.int
end

上段がダメージに、
下段(else部分)が回復量に影響する量です。
回復量に影響させない場合は追加不要です。
spもhpと同じように魔力依存なら
recover_hp部分をrecover_spにしたものを追加。
+= user.int にしていますが、
これだと魔力の値が直接そのまま影響するので
計算を入れて微調整するといいかもしれません。

■Scene_Item

「フレーム更新」ターゲットが全体の場合、と、ターゲットが単体の場合
used=省略...(@item)を(0, @item)に変更。

これでメニューからのアイテム使用では
魔力に依存しなくなります。

■Scene_Battle 4

「アイテムアクション結果作成」一番下部分
for target in @target_battlers
 target.item_effect(@active_battler, @item)
end



スキルを使わず、アイテムだけで戦うシステムだとか
そういった個性的なゲームを作る際にも役に立つ…
と思います。

魔力でなく、他の能力でもできるので
アイテム専用の能力のようなものを作って
反映させるようにしても良いかもしれません

category:
2012-06-23

RGSS-毎ターンHP・SP回復

«RGSS一覧

戦闘開始時にSPを0にして、徐々にSPが溜まっていく…
そんなシステムを作りたかったので
今回は毎ターンSPが回復するシステムを紹介。



【今回の変更点】
・Scene_Battle 1
・Scene_Battle 4




■Scene_Battle 1

戦闘のはじめに、アクターとエネミーのSPをリセットします。

「トループを準備」
$game_troop.setup(@troop_id)の下に
以下のように入れます。
for actor in $game_party.actors
 actor.sp = 数値
end


SPをリセットする必要はないよ~
という方は次へ。


■Scene_Battle 4

「フレーム更新 メインフェーズステップ1」
# 未行動バトラーが存在しない場合 (全員行動した)
if @action_battlers.size == 0
 for actor in $game_party.actors
  actor.sp += 1
  @status_window.refresh
 end

 # パーティコマンドフェーズ開始
 start_phase2
 return
end

上記青文字部分を追加します。

ここでリフレッシュさせておかないと、
数値が反映されないので…
(SPを最初に0にリセットさせたとして)
「SPが1あるのにバトルが進行しないと表示が0のまま」
になります。
SP1あって使えるスキルが、SP0のままで使えるのか?!
みたいなヘンな事になるので忘れずに。

同じくエネミーも毎ターンSPを回復させたいよ
っていう方は同じように
for enemy in $game_troop.enemies
 enemy.sp += 数値
end

と書き込めばOK。

エネミーの場合はステータスが表示されていないので
特にリフレッシュする必要はないです。
戦闘開始時にSPをリセットする場合
エネミーの分もアクターと同じくリセットしておきましょう。



はじめは0から、だんだんspが回復していって
ターンが経てば経つほど強いスキルが使える!!!
でも、デフォルト状態だと戦闘終了後もSPは戦闘終了時のままです。
なので、戦闘が終了・中断されたら全回復させるとか
そういった処理をすると良いかもしれません。

よろしければこっちの記事を参考に(*・ω・)っ「レベルアップ・戦闘終了後に全回復


また、spの部分をhpに変えれば
毎ターンHPが回復するようにもできます。
逆に、どんどんターン毎に減っていくというシステムも。

ここには書いてませんが、とあるアイテムを装備していると毎ターン回復するというようにも改造できますので色々やってみてくださいね。
気が向いたら特定アイテム装備で毎ターン回復orダメージの方法も書きます。
…要望があればすぐ書くかもですが。

category:
2012-06-17

RGSS-アイテム改造

«RGSS一覧

武器や防具を改造できるシステム
条件を満たすと説明が変化するアイテム…

どれも、違うアイテムとして作れば
デフォルトのままでも十分に表現できますが、
同じ名前のアイテムばかりだと管理が大変だとか
もっと幅を広げたい、自由に分岐によって変化する数値を変えたいなど
思うこともあったりなかったり(´・ω・`)

そんなわけで、
今回はアイテム改造のための記述を紹介します。



【今回の変更点】
・Game_System
・Scene_Load




アイテムの名前、説明、値段を変えたい場合は
以下のようにイベントコマンドのスクリプトに記入します。
$data_items[ID].name = "名前"
$data_items[ID].description = "説明"
$data_items[ID].price = 値段

[ID]はアイテムのIDなので、
データベースを見ればわかるかと思います。

また、武器や防具の場合は
下記のように攻撃力の数値を変更する事もできます。
$data_weapons[ID].atk = 数値
$data_armors[ID].pdef = 数値
上の場合では、武器IDの攻撃力を
防具IDの物理防御を変更しますが、
攻撃力や物理防御だけでなく
他の数値や、アイコンなども変更できるので
atkの部分をdex_plusやicon_nameに変えて設定します。
変更できるものの詳細はヘルプにある
RPG::Weapon、RPG::Armor、RPG::Itemを参照してください。


  …これだけだと
セーブ時に変更が保存されないため
次回ゲームを続きからはじめると
変更されていない状態に戻ってしまいます。
(一時的なものであればここまででダイジョウブです)
なので、セーブデータに含まれるように次の段階を踏みます。
今度はスクリプトエディタを編集します。


■Game_System

「公開インスタンス変数」
attr_accessor :custom_item(←ここはわかりやすい変数名でOK)

「オブジェクト初期化」
@custom_item = $data_items[ID](変更するアイテムのID)
を追加。

変更したいアイテムが複数の場合は
custom_item1、2..と増やして
上記と同じように、オブジェクト初期化で
アイテムIDを入れておきます。

これでセーブ時に、変更が保存されるようになります。

■Scene_Load

file.closeよりも下のあたりに
$data_items[ID] = $game_system.custom_item
を入れます。
これで読み込みが完了します。



見ればわかるかと思いますが、ここで紹介したのは
$game_system内の custom_item の変数に $data_items[ID] を入れておき、それをロード時に$data_items[ID]に渡す、というやり方です。
セーブデータに含まれるようにしなければ、変更は適用されません。

これを利用して
鍛える事のできる武器や防具、
条件を満たすと能力が変化するアイテムも作れます。

category:
2012-04-07

RGSS-購入・売却モードを別々に

«RGSS一覧

どこのお店も購入と売却の両方ができちゃうのって
なんだかおかしいような…と思った事、ありませんか?
そんなアナタはちょっぴりリアリスト(笑)

あまり必要ないかな~とも思ったんですが
売却機能のない、販売オンリーの店を多くして
ほんの一部でしかアイテムを売れない! というシステムにすると、
意外と難易度やゲームバランスがとれたり。
また、現実を舞台にしたゲームを作る場合にも
効果的なのではないでしょうか。

というわけで、今回もやっちゃいました。
商品リストをスクリプトで管理するのは面倒なので
ショップの処理をそのまま利用します。



【今回の変更点】
・Scene_Shop



■Scene_Shop

「メイン処理」のトランジション実行の前に
下記を追加します。
case $buyorsell
when 0 # 購入モード
 @buy_window.active = true
 @buy_window.visible = true
 @status_window.visible = true
when 1 # 売却モード
 @sell_window.active = true
 @sell_window.visible = true
end

ここで登場するグローバル変数($buyorsell)は
ショップのモード管理に使用するだけなので、
分かりやすい名前を付けておけば大丈夫です。
好きな名前でいいです。

購入・売却を選択するコマンドは必要ないので
@command_window、@dummy_window
に関する項目を消します。

dispose、update、
「フレーム更新」79~83行あたりの
if @command_window.active…(4行)と
100~143行あたりの
「フレーム更新 (コマンドウィンドウがアクティブの場合)」
の項目も消去。

「フレーム更新 (購入ウィンドウがアクティブの場合)」
「フレーム更新 (売却ウィンドウがアクティブの場合)」
はどちらも、
# ウィンドウの状態を初期モードへ
@command_window.active = true
@dummy_window.visible = true
@sell_window.active = false
@sell_window.visible = false
@status_window.item = nil
# ヘルプテキストを消去
@help_window.set_text("")

を消して、
代わりに
# マップ画面に切り替え
$scene = Scene_Map.new

を追加します。
Bボタンが押された場合、
コマンドウィンドウへ行くのではなく
マップ画面に戻るようにします。


あとはイベントの編集で
モードを設定し、ショップの処理を実行するだけです。

イベントの編集で「ショップの処理」を使用する際は
ショップの処理の前に必ず
イベントコマンド「スクリプト」に
$buyorsell = 数値を書いて挿入して下さい。
ここに書いたやり方ですと、
0が購入モード、1が売却モードになります。

ショップの処理の商品リストに
ひとつでもアイテムを入れていないと
「商品リストが空です」と出てしまうので、
売却モードの場合特に商品リストは反映されないので
適当にひとつ、アイテムを登録しておきましょう。



デフォルトの表示だと
コマンドウィンドウを使わなくなると上にスペースができてしまうので、各ウィンドウの位置を調整したりと工夫する必要がありそうですね。

category:
2012-04-05

RGSS-レベルアップ・戦闘終了後に全回復

«RGSS一覧

HP・SPが低めでギリギリの戦闘を楽しめる
そんなゲームを作る際にオススメなのが
戦闘終了後にHP、SP、状態が全回復するシステムです!

ちょこっとスクリプトを変更するだけなのでカンタンに作れます。
また、レベルアップ時のみ全回復する方法も書いておきますね。
…とは言っても、もともとある全回復のメソッドを呼び出すだけなので非常に簡単です。



【今回の変更点】
・Scene_Battle 1(戦闘終了時)
・Game_Actor(レベルアップ時)




■Scene_Battle 1

131~157行あたりの「バトル終了」の項目

# バトル用ステートを解除
for actor in $game_party.actors
 actor.remove_states_battle
end

この actor.remove_states_battle 部分を
actor.recover_all に書き換えるだけです。
これで勝利・敗北・逃走・バトル中断時にパーティのHP、SP、状態が全回復します。
remove_states…を書き換えてしまうのは、recover_allでステートも回復してしまうので「戦闘終了後回復するステート」の解除が必要なくなるためです。

■Game_Actor

レベルアップ時に全回復、という場合は
「EXPの変更」にある
@level += 1 の下に
recover_all を追記するだけです。

必ずこの下じゃないとダメだよ~ってコトはないですけど。
レベルアップしたら全回復、とわかりやすい順番に
記述した方がいいかな。と(´・ω・`)



よくあるシステムですが、これだけでも結構アイデアの幅が広がると思います。
ゲームはシステム重視か、ストーリー重視かと
悩みどころですが…
システムもストーリーも面白いのが一番ですよね(*・ω・*)
完成できるかどうかというのが最優先の気もしますが。。。

制作、頑張っていきましょう!!

category:
2012-04-02

RGSS-ダメージ文字・動作変更

«RGSS一覧

ダメージのふち色や文字の色、書体を変えたい!
と思って、スクリプトエディタと睨めっこしても
ダメージ表示の詳細が見つからない…
そう思ってたら、ヘルプの中にありました!
読んでみるものです、ヘルプ(・ω・)
とりあえず、RPGツクールXPのヘルプを開いてみましょう。



【今回の変更点】
・RPG::Sprite(追加)



■RPG::Sprite

RGSS組み込みクラスなので、デフォルトのままでは
スクリプトエディタ上に「RPG::Sprite」はないので
ヘルプに記載されている定義をコピーしてエディタに持ってきます。

まずはRPGツクールXPのヘルプを開き
RGSSリファレンス>ゲームライブラリ>組み込みクラス>RPG::Sprite
を開きます。

RPG::Spriteの下の方にある「定義」
スクリプトがつらつら~っと記載されている部分をコピー。
スクリプトエディタの一番上に貼り付けます。
これでRPG::Spriteがエディタに貼り付けたものに
再定義される事になります。

注釈がないのでスクリプト始めたばかりだと
「わけわからん!!!」って思うかも知れませんが
そんな方は「def」部分に注目!

ダメージ文字の変更


disposeやらcollapseやらと書かれていますね?
丁度def collapseでくくられてるとこの下あたりに
def damage(value, critical)とあります。
ここがダメージ文字の描画部分です。

bitmap.font.name = "Arial Black"←書体
bitmap.font.size = 32←文字サイズ
bitmap.font.color.set(0, 0, 0)←文字縁取り色
bitmap.draw_text(-1, 12-1, 160, 36, damage_string, 1)
bitmap.draw_text(+1, 12-1, 160, 36, damage_string, 1)
bitmap.draw_text(-1, 12+1, 160, 36, damage_string, 1)
bitmap.draw_text(+1, 12+1, 160, 36, damage_string, 1)
if value.is_a?(Numeric) and value < 0
 bitmap.font.color.set(176, 255, 144)←回復色
  else
 bitmap.font.color.set(255, 255, 255)←ダメージ色
end


上記にboldやitalicを追加して、
太字や斜体表示にする事もできます。

青色にした4つの項目は文字の縁取りの役目をしています。
縁が必要ない場合は、縁取り色のカラーセットと一緒に
消してしまっても大丈夫です(・ω・)

この下にある、クリティカル表示の設定も同じように記述してあるので
ついでにクリティカル表示の色などを変更してみるのもいいかもしれません。

"CRITICAL"表記を
"会心の一撃"や"痛恨の一撃"に変える事もできます。



ダメージポップ動作の変更


こっちは「def update」の中身です。

if @_damage_duration > 0
 @_damage_duration -= 1
 case @_damage_duration
when 38..39
 @_damage_sprite.y -= 4
when 36..37
 @_damage_sprite.y -= 2
when 34..35
 @_damage_sprite.y += 2
when 28..33
 @_damage_sprite.y += 4
end
@_damage_sprite.opacity = 256 - (12 - @_damage_duration) * 32
if @_damage_duration == 0
 dispose_damage
 end
end

…という所を探してみてください。

主に変更するのはsprite.xとyです。
ここを調整すればダメージポップの動作が変わります。
when 数値..数値は
表示される時間(@_damage_duration)と関係しているので
ここの数値を変更したり、
whenを増やして動きを細かくする事もできます。



書体を変更する際は、遊ぶ側の事も考えて
MS明朝、MSゴシックなどの
初期から入っているような書体を選びましょう。
変わった書体を使用したい時は
自作か、再配布が可能な(配布に許可をもらっている)書体をゲーム配布時に同梱するといいかもしれません。

書式を変えるだけでも、雰囲気は大分違ったものになります。

category: