#◆◇◆◇◆ ウェーブダメージ in Font ver 1.00 ◇◆◇◆◇ # サポート掲示板 http://www2.ezbbs.net/21/minto-aaa/ # by みんと =begin 説明 Critical 表示を除く全ての表示でフォントを使用しているタイプです。 フォントのため、描写の処理は重くなりますが、 フォントを使用したい方はこちらをご利用ください。 =end #============================================================================== # ☆ MINTO #------------------------------------------------------------------------------ # 様々なフラグを扱うメインモジュールです。 #============================================================================== module MINTO # ウェーブダメージを有効化 ( true で有効 / false で無効 ) RGSS["Wave_Damage_Font"] = true end if MINTO::RGSS["Wave_Damage_Font"] == true then #============================================================================== # ☆ カスタマイズ #------------------------------------------------------------------------------ # 機能のカスタマイズを行うモジュールです。 #============================================================================== module MINTO # 使用するフォント(ダメージが文字列の場合) # D_Font = ["第一希望", "第二希望"] D_Font = ["MS Pゴシック", "MS UI Gothic"] # ウェーブの間隔(フレーム) # あんまり長くするとダメージの表示時間が長くなります Wave_Rate = 5 end #============================================================================== # ■ Mint_Damage_System #------------------------------------------------------------------------------ #  ピクチャー数字のスプライト表示を扱うクラスです。 # このクラスは数値の高速再描写に特化したクラスとなっています。 #============================================================================== class Mint_Damage_System #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_reader :x # X座標 attr_reader :y # Y座標 #-------------------------------------------------------------------------- # ● オブジェクト初期化 # x : X座標 # y : Y座標 # index : 求められた行数 # z : Z座標 # size : 求められた1カラーの高さ # text : 求められたピクチャー #-------------------------------------------------------------------------- def initialize(x, y, index, z = 999) # 各種データを初期化 @x = x @y = y @z = z @index = index @count = [] # ビットマップを作成 @text_bitmap = Bitmap.new(32, 32) @text_bitmap.font.name = MINTO::D_Font @text_bitmap.font.size = 30 # クリティカル表示用スプライト @critical = Sprite.new @critical.visible = false @critical.bitmap = RPG::Cache.picture("critical") # スプライトを収納する配列を定義 @sprite = [Sprite.new] # スプライト生成(求められた行数分) (0...@index).each do |i| @sprite[i] = Sprite.new @sprite[i].x = x.to_i @sprite[i].y = y.to_i @sprite[i].z = z end end #-------------------------------------------------------------------------- # ● インデックスの変更 # index : 求められたインデックス #-------------------------------------------------------------------------- def set_index(index) # スプライト生成(求められた行数分) (0...index).each do |i| # すでにスプライトがある場合 if @sprite[i] != nil # 次へ next end @sprite[i] = Sprite.new @sprite[i].x = @x.to_i @sprite[i].y = @y.to_i @sprite[i].z = @z.to_i end # インデックスを更新 @index = index end #-------------------------------------------------------------------------- # ● X座標のセット # x : 基本X座標 # damage : 求められた文字 #-------------------------------------------------------------------------- def set_x(x, damage) # 求められた文字を一文字ずつ配列にする text = damage.to_s.split(//) # 文字幅を初期化 text_width = 0 # 求められた行数分繰り返す (0...@index).each do |i| # 文字の幅を取得 text_width += 32 - (@text_bitmap.text_size(text[i]).width) / 2 # X座標を調整する(左寄せ) @sprite[i].x = (-32 + x) + text_width end @critical.x = @sprite[0].x + 16 @critical.y = @sprite[0].y - 32 end #-------------------------------------------------------------------------- # ● X座標の変更 # n : 新しいX座標 #-------------------------------------------------------------------------- def x=(n) # X座標の変更(イテレータ) (0...@index).each{|i| @sprite[i].x = n} end #-------------------------------------------------------------------------- # ● Y座標の変更 # n : 新しいY座標 #-------------------------------------------------------------------------- def y=(n) # Y座標の変更(イテレータ) (0...@index).each{|i| @sprite[i].y = n} end #-------------------------------------------------------------------------- # ● 可視状態の取得 #-------------------------------------------------------------------------- def visible # 先頭の可視状態を返す return @sprite[0].visible end #-------------------------------------------------------------------------- # ● 内容の可視状態の変更 # flag : 新しい可視状態 #-------------------------------------------------------------------------- def visible=(flag) # 可視状態の変更(イテレータ) (0...@index).each{|i| @sprite[i].visible = flag} # クリティカルを初期化 @critical.visible = flag end #-------------------------------------------------------------------------- # ● 透明度の取得 #-------------------------------------------------------------------------- def opacity # 先頭の透明度を返す return @sprite[0].opacity end #-------------------------------------------------------------------------- # ● 透明度の変更 # opacity : 新しい透明度 #-------------------------------------------------------------------------- def opacity=(opacity) # 透明度の変更(イテレータ) (0...@index).each{|i| @sprite[i].opacity = opacity} @critical.opacity = opacity end #-------------------------------------------------------------------------- # ● クリア #-------------------------------------------------------------------------- def clear # 求められた行数分のビットマップをクリア (0...@index).each do |i| @sprite[i].bitmap = nil end end #-------------------------------------------------------------------------- # ● 文字色取得 # n : 文字色番号 (0〜7) #-------------------------------------------------------------------------- def text_color(n) case n when 0 return Color.new(255, 255, 255) when 1 return Color.new(255, 0, 0) when 2 return Color.new(200, 200, 64) when 3 return Color.new(0, 255, 255) when 4 return Color.new(128, 255, 255, 255) when 5 return Color.new(255, 128, 255, 255) when 6 return Color.new(255, 255, 128, 255) when 7 return Color.new(192, 192, 192, 255) end end #-------------------------------------------------------------------------- # ● 縁文字作成 # text : 求められた文字列 # bitmap : ビットマップ # color : カラーID #-------------------------------------------------------------------------- def frame_text(text, bitmap, color) bitmap.font.name = MINTO::D_Font bitmap.font.size = 30 bitmap.font.color.set(0, 0, 0) bitmap.draw_text(-1, -1, 40, 40, text, 1) bitmap.draw_text(1, -1, 40, 40, text, 1) bitmap.draw_text(-1, 1, 40, 40, text, 1) bitmap.draw_text(1, 1, 40, 40, text, 1) bitmap.font.color = text_color(color) bitmap.draw_text(0, 0, 40, 40, text, 1) end #-------------------------------------------------------------------------- # ● セットストリング # string : 求められた文字列 # collar : 求められたカラーインデックス # critical : クリティカルの有無 #-------------------------------------------------------------------------- def set_string(string, collar, critical = false) # クリティカルを初期化 @critical.visible = false @critical.opacity = 255 # 求められた文字を一文字ずつ配列にする text = string.to_s.split(//) # 求められた行数分繰り返す (0...@index).each do |i| # テキストが存在しない場合 if text[i] == nil # 次の処理へ next end # X座標を調整する(左寄せ) @sprite[i].x = @x.to_i + (i * 40) # ビットマップ作成 @sprite[i].bitmap = Bitmap.new(40, 40) # 文字列を描写 frame_text(text[i], @sprite[i].bitmap, collar) # 不可視状態に設定 @sprite[i].visible = false # 透明度を初期化 @sprite[i].opacity = 255 # カウントを設定 @count[i] = 40 @count[i] += i * MINTO::Wave_Rate end # クリティカルの場合 if critical @critical.visible = true end end #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- def update # スプライトのループ処理 (0...@index).each do |i| # カウントが0の場合 if @count[i].to_i == 0 # 次の処理へ next end # カウントが40以下の場合 if @count[i] <= 40 # スプライトを可視状態にする @sprite[i].visible = true # 残りカウントに応じて分岐 case @count[i] when 36..39 @sprite[i].y -= 4 when 33..37 @sprite[i].y -= 2 when 32..34 @sprite[i].y += 2 when 25..32 @sprite[i].y += 4 end end @critical.y = @sprite[0].y - (32) # カウントを減らす @count[i] -= 1 end end #-------------------------------------------------------------------------- # ● 解放 #-------------------------------------------------------------------------- def dispose # スプライトを解放 for s in @sprite + @critical.to_a s.dispose s = nil end # ビットマップを解放 @text_bitmap.dispose end end #============================================================================== # ■ Sprite_Battler #------------------------------------------------------------------------------ #  バトラー表示用のスプライトです。Game_Battler クラスのインスタンスを監視し、 # スプライトの状態を自動的に変化させます。 #============================================================================== class Sprite_Battler < RPG::Sprite #------------------------------------------------------------------------- # ● ダメージの表示 # value : ダメージ値 # critical : クリティカルの有無 #------------------------------------------------------------------------- def damage(value, critical) # 求められた文字を一文字ずつ配列にする text = value.to_s.split(//) # 初期定義(ダメージスプライトが存在しない場合) @damage ||= Mint_Damage_System.new(0, 0, text.size, 3000) # インデックスのセット @damage.set_index(text.size) # ダメージを作成 set_damage(value, critical, text.size) # ダミーダメージを作成 @_damage_sprite = Sprite.new # 座標を取得 x = @battler.screen_x - self.ox / 2 y = @battler.screen_y - self.oy / 2 + self.viewport.rect.y # ダメージの座標をセット @damage.set_x(x, value) @damage.y = y end #------------------------------------------------------------------------- # ● ダメージ作成 # value : ダメージ値 # critical : クリティカルの有無 #------------------------------------------------------------------------- def set_damage(value, critical, size) # カラーIDを取得 if value.to_i >= 1 if critical c = 1 else c = 2 end else c = 0 end # ダメージをセット(文字列) @damage.set_string(value.to_s, c, critical) # ダメージカウントをセット @_damage_duration = 80 + (size * MINTO::Wave_Rate) # ダメージが空文字の場合 if value == "" # ダメージカウントをリセット @_damage_duration = 0 end # ダメージカウントが奇数の場合 if @_damage_duration % 2 == 1 # ダメージカウントを偶数にする @_damage_duration += 1 end end #------------------------------------------------------------------------- # ● ダメージ解放 #------------------------------------------------------------------------- def dispose_damage # ダメージが存在する場合 if @damage != nil # ダメージを不可視状態にする @damage.visible = false end # ダミーダメージが存在する場合 if @_damage_sprite != nil # ダミーダメージを解放 @_damage_sprite.dispose @_damage_sprite = nil end end #------------------------------------------------------------------------- # ● フレーム更新(ダメージ) #------------------------------------------------------------------------- def update_damage # ダメージカウントが1以上の場合 if @_damage_duration >= 1 # ダメージカウントを更新する @_damage_duration -= 1 # 表示中のダメージを更新 @damage.update # ダメージカウントが5以下の場合 if @_damage_duration <= 5 # 透明度の配列(6段階) opacity = [0, 50, 100, 150, 200, 250] # 表示中のダメージの透明度を下げる @damage.opacity = opacity[@_damage_duration] end end end #-------------------------------------------------------------------------- # ● 解放 #-------------------------------------------------------------------------- alias dispose_Wave_Damage dispose def dispose # 元の処理を実行 dispose_Wave_Damage # ダメージが存在する場合 if @damage != nil # ダメージを解放 @damage.dispose end end #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- alias update_Wave_Damage update def update # 元の処理を実行 update_Wave_Damage # ダメージを更新 update_damage end end end