# ▽△▽ XRXSv9. BaST-VX.BS2. ラピッドデザイン ▽△▽ # [伸縮対応] # # publish 2010/ 3/ 6 # update -/ 4/25 # #============================================================================== # □ カスタマイズポイント #============================================================================== module XRXSV9BS # # 画像ファイル名 (Graphics/System) # HPNumber = "NumberL" MPNumber = "NumberS" HPMPMeters = "HPMPMeters" AS_BACK = "AS_BackV" # # フェイスを描画する?(true/false) # (バトラーフェイス/XPバトラーズ等を使用する場合は false に) # FaceOn = false # # 表示位置Y # HP_Y = 84 HPM_Y = 84 MP_Y = 103 end #============================================================================== # --- ラピッドナンバー スプライトシステム --- #============================================================================== class RapidNumber def initialize(x, y, skin, viewport = nil) @viewport = viewport @skin = skin @x = x @y = y @z = 105 @opacity = 255 @w = skin.rect.width / 10 @h = skin.rect.height @sprites = [] @number_bitmaps = [] rect = Rect.new(0, 0, @w, @h) for i in 0..9 rect.x = i * @w bitmap = Bitmap.new(@w, @h) bitmap.blt(0, 0, @skin, rect) @number_bitmaps[i] = bitmap end end def set(number) number_digits = [] loop do number_digits.push(number % 10) number /= 10 break if number == 0 end need_reset = false for i in 0...number_digits.size if @sprites[i] == nil @sprites[i] = Sprite.new(@viewport) need_reset = true end @sprites[i].bitmap = @number_bitmaps[number_digits[i]] end for i in number_digits.size...@sprites.size @sprites[i].bitmap = nil end reset if need_reset end def reset for i in 0...@sprites.size sprite = @sprites[i] sprite.x = @x - @w * i sprite.y = @y sprite.z = @z sprite.ox = @w sprite.oy = @h sprite.opacity = @opacity end end def x=(n) @x = n reset end def y=(n) @y = n reset end def z=(n) @z = n reset end def viewport=(viewport) @sprites.each{|sprite| sprite.viewport = viewport } end def dispose @sprites.each{|sprite| sprite.dispose } end def opacity=(n) @opacity = n reset end end #============================================================================== # アクター一人の分のステータスセット(ラピッドナンバーを使用) #============================================================================== class ActorStatus_SpriteSet def initialize(actor, viewport = nil) if viewport == nil x = actor.battlestatus_offset - 16 y = 288 * Graphics.height / 416 w = Graphics.width h = 128 * Graphics.height / 416 viewport = Viewport.new(0, y, w, h) viewport.z = 104 viewport.ox = x end @viewport = viewport num_skin_l = Cache.system(XRXSV9BS::HPNumber) num_skin_s = Cache.system(XRXSV9BS::MPNumber) @sprite_hp = RapidNumber.new(0,0, num_skin_l, @viewport) @sprite_mp = RapidNumber.new(0,0, num_skin_s, @viewport) @bar_skin = Cache.system(XRXSV9BS::HPMPMeters) @w = @bar_skin.rect.width @h = @bar_skin.rect.height / 6 @sprite_hpbar = Sprite.new(@viewport) @sprite_hpbar.bitmap = @bar_skin @sprite_hpbar.src_rect = Rect.new(0, @h, @w, @h) @sprites = [@sprite_hp, @sprite_mp, @sprite_hpbar] set_actor(actor) end def actor return @actor end def set_actor(actor) @actor = actor @now_hp = @actor.hp @now_mp = @actor.mp refresh @sprite_mp.set(@now_mp) @sprite_hp.set(@now_hp) reset_hpmeter_index end def reset_hpmeter_index n = 2 if @now_hp == @actor.maxhp n = 3 elsif @now_hp <= @actor.maxhp / 3 n = 1 end @sprite_hpbar.src_rect.width = @w * @now_hp / @actor.maxhp @sprite_hpbar.src_rect.y = @h * n end def update # HP/SPの変化を判定 if @now_hp != @desthp sign = (@now_hp > @desthp ? -1 : 1) @now_hp = @now_hp + sign * [(@desthp - @now_hp).abs / 8, 1].max @sprite_hp.set(@now_hp) reset_hpmeter_index end if @now_mp != @destmp sign = (@now_mp > @destmp ? -1 : 1) @now_mp = @now_mp + sign * [(@destmp - @now_mp).abs / 8, 1].max @sprite_mp.set(@now_mp) end end def refresh @desthp = @actor.hp @destmp = @actor.mp end def x=(n) @sprite_hp.x = n + 76 @sprite_mp.x = n + 76 @sprite_hpbar.x = n end def y=(n) @sprite_hp.y = n + XRXSV9BS::HP_Y @sprite_mp.y = n + XRXSV9BS::MP_Y @sprite_hpbar.y = n + XRXSV9BS::HPM_Y end def z=(n) @sprites.each{|sprite| sprite.z = n } @sprite_hpbar.z = n + 1 end def viewport=(viewport) @sprites.each{|sprite| sprite.viewport = viewport } end def dispose @sprites.each{|sprite| sprite.dispose } end end #============================================================================== # バトルステータスウィンドウ #============================================================================== class Window_BattleStatus < Window_Selectable #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- alias xrxsv9bs_initialize initialize def initialize @actorstatus_sprites = [] @forcing_z = 100 # 呼び戻す xrxsv9bs_initialize # 背景を消す self.opacity = 0 end #-------------------------------------------------------------------------- # 位置 #-------------------------------------------------------------------------- def z=(n) @forcing_z = n @actorstatus_sprites.each{|spriteset| spriteset.z = n } self.opacity = (n >= 104 ? 255 : 0) super end #-------------------------------------------------------------------------- # ビューポートの設定 #-------------------------------------------------------------------------- def viewport=(viewport) for sprite in @actorstatus_sprites sprite.viewport = viewport end super end #-------------------------------------------------------------------------- # ● リフレッシュ [再定義] #-------------------------------------------------------------------------- def refresh # 最大確保人数の取得 #max = Game_Party::MAX_MEMBERS @item_max = $game_party.members.size @column_max = @item_max as_back = Cache.system(XRXSV9BS::AS_BACK) # self.contents.clear for i in 0...$game_party.members.size actor = $game_party.members[i] x = actor.battlestatus_x x -= 48 draw_actor_halfface(actor, x, 2) if XRXSV9BS::FaceOn draw_actor_name(actor, x, 2) self.contents.blt(x, 0, as_back, as_back.rect) draw_actor_state(actor, x, 24, 96) x += actor.battlestatus_offset - 16 if @actorstatus_sprites[i] == nil @actorstatus_sprites[i] = ActorStatus_SpriteSet.new(actor, self.viewport) elsif @actorstatus_sprites[i].actor != actor @actorstatus_sprites[i].set_actor(actor) end @actorstatus_sprites[i].x = x + actor.battlestatus_offset @actorstatus_sprites[i].y = 0 @actorstatus_sprites[i].refresh end if $game_party.members.size < @actorstatus_sprites.size pos = $game_party.members.size len = @actorstatus_sprites.size - pos + 1 disuse_sprites = @actorstatus_sprites.slice!(pos, len) disuse_sprites.each{|sprite| sprite.dispose } end self.z = @forcing_z end def refresh_lite for sprite in @actorstatus_sprites sprite.refresh end end #-------------------------------------------------------------------------- # △ アクターの半顔グラフィックの描画 #-------------------------------------------------------------------------- if XRXSV9BS::FaceOn def draw_actor_halfface(actor, x, y) bitmap = Cache.face(actor.face_name) rect = Rect.new(0, 0, 96, 73) rect.x = actor.face_index % 4 * 96 rect.y = actor.face_index / 4 * 96 + 4 self.contents.blt(x, y, bitmap, rect) bitmap.dispose end end #-------------------------------------------------------------------------- # ○ フレーム更新 #-------------------------------------------------------------------------- def update super @actorstatus_sprites.each{|spriteset| spriteset.update } return end def dispose @actorstatus_sprites.each{|spriteset| spriteset.dispose } super end #-------------------------------------------------------------------------- # ● カーソルの更新 #-------------------------------------------------------------------------- def update_cursor if @index < 0 self.cursor_rect.empty else self.cursor_rect = item_rect(@index) end end #-------------------------------------------------------------------------- # ● 項目を描画する矩形の取得 #-------------------------------------------------------------------------- def item_rect(index) rect = Rect.new(0, 0, 0, 0) rect.width = self.contents.width / $game_party.members.size rect.height = self.contents.height rect.x = index % @column_max * rect.width return rect end end