#◆◇◆◇◆ ウェーブダメージ ver 1.05 ◇◆◇◆◇ # サポート掲示板 http://www2.ezbbs.net/21/minto-aaa/ # by みんと =begin 更新履歴 ver 1.05 回復表示の「ずれ」を修正 ver 1.04 一部の仕様を変更 ver 1.03 Miss 表示をピクチャーに変更 ver 1.02 ダメージが空文字の場合 エラー落ちするミスを修正 ver 1.01 若干仕様変更 説明 Miss 表示はダメージが Miss の場合だけピクチャーで表示されます。 ダメージ表示を一文字ずつ表示するタイプに変更し、 ウェーブしながら表示されます。 ダメージも、オリジナルのピクチャーを使用できます。 ただし、 文字列の場合はピクチャーではなく、フォントになります。 この場合も、一文字ずつ表示されます。 ピクチャーはピクチャーフォルダにインポートしてください。 =end #============================================================================== # ☆ MINTO #------------------------------------------------------------------------------ # 様々なフラグを扱うメインモジュールです。 #============================================================================== module MINTO # ウェーブダメージを有効化 ( true で有効 / false で無効 ) RGSS["Wave_Damage"] = true end if MINTO::RGSS["Wave_Damage"] == true then #============================================================================== # ☆ カスタマイズ #------------------------------------------------------------------------------ # 機能のカスタマイズを行うモジュールです。 #============================================================================== module MINTO # ダメージ用ピクチャーの名前 Damage_P = "num" # 使用するフォント(ダメージが文字列の場合) # 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, size = 28, text = MINTO::Damage_P) # ピクチャーデータを読み込んで代入 @number = RPG::Cache.picture(text) # 各種データを初期化 @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") # カラーサイズを取得(画像の高さをsizeで割った数) collar_size = @number.rect.height / size # 読み込んだ画像の幅を10で割った値が、1文字1文字の幅になる @width = @number.rect.width / 10.0 # 読み込んだ画像の高さをカラーサイズで割った数が1カラーの高さになる height = @number.rect.height / collar_size @height = height.to_i # スプライトを収納する配列を定義 @sprite = [Sprite.new] # スプライト生成(求められた行数分) (0...@index).each do |i| @sprite[i] = Sprite.new @sprite[i].x = x.to_i + (i * @width) @sprite[i].y = y.to_i @sprite[i].z = z end # ピクチャー数字用の配列生成 @picture_number = [] # X, Y, 幅, 高さ rect = Rect.new(0, 0, @width, height) # 各カラー分のピクチャーを作成 (0...collar_size).each do |collar_index| # 配列内配列を作成 @picture_number[collar_index] = [] # 0〜9までのピクチャー数字を予め作成 (0..9).each do |i| # インデックス(i)から、 # 基本幅(@width)を掛けたところにある画像を参照する rect.x = i * @width # collar_index から # 基本高さ(height)を掛けたところにある画像を参照する rect.y = collar_index * height # Bitmapを作成 bitmap = Bitmap.new(@width, height) # ピクチャー生成 bitmap.blt(0, 0, @number, rect) # 生成したピクチャーを収納 @picture_number[collar_index][i] = bitmap end 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 + (i * @width) @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 -= ["-"] # 文字幅を初期化 text_width = 0 # 求められた行数分繰り返す (0...@index).each do |i| # ダメージが文字列の場合 if damage.is_a?(String) # 文字の幅を取得して加算 text_width += 32 - (@text_bitmap.text_size(text[i]).width) / 2 # X座標を調整する(左寄せ) @sprite[i].x = (-32 + x) + text_width else # X座標を調整する(左寄せ) @sprite[i].x = (x + @x.to_i) + (i * @width) end 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(//) text -= ["-"] # 求められた行数分繰り返す (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 #-------------------------------------------------------------------------- # ● セットテキスト # number : 求められた数値 # collar : 求められたカラーインデックス # critical : クリティカルの有無 #-------------------------------------------------------------------------- def set_text(number, collar = 0, critical = false) # クリティカルを初期化 @critical.visible = false # 求められた文字を一文字ずつ配列にする text = number.to_s.split(//) text -= ["-"] # クリア行数 clear_index = text.size == 1 ? 1 : 0 # X座標を調整する x_size = @index - text.size # 求められた行数分繰り返す (0...@index).each do |i| # クリア行数が0で求められた数字が0か、 # 元の数字が存在しなければなら次へ if clear_index == 0 && text[i].to_i == 0 || text[i] == nil @sprite[i].bitmap = nil next end # X座標を調整する(右寄せ) @sprite[i].x = @x.to_i + (i * @width) + (x_size * @width) # 条件をクリアしていれば、クリア行数に1を加算 clear_index += 1 # 条件をクリアしていれば描写 @sprite[i].bitmap = @picture_number[collar][text[i].to_i] # 不可視状態に設定 @sprite[i].visible = false # 透明度を初期化 @sprite[i].opacity = 255 @critical.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 - (@height + 4) # カウントを減らす @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(//) text -= ["-"] # 初期定義(ダメージスプライトが存在しない場合) @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 # ダメージが Miss の場合 if value == "Miss" then # ダメージの座標をセット @damage.set_x(x, 1233) else # ダメージの座標をセット @damage.set_x(x, value) end @damage.y = y end #------------------------------------------------------------------------- # ● ダメージ作成 # value : ダメージ値 # critical : クリティカルの有無 #------------------------------------------------------------------------- def set_damage(value, critical, size) # ダメージが文字列の場合 if value.is_a?(String) # ダメージが Miss の場合 if value == "Miss" then # 数値ダメージとして表示 @damage.set_text(1233, 5, false) else # ダメージをセット(文字列) @damage.set_string(value.to_s, 0, critical) end else # カラーIDを取得 if value.to_i >= -1 if critical c = 1 else c = 0 end else c = 2 end # ダメージをセット(数値) @damage.set_text(value, c, critical) end # ダメージカウントをセット @_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