| 
 
| 赞 | 0 |  
| VIP | 0 |  
| 好人卡 | 3 |  
| 积分 | 1 |  
| 经验 | 1105 |  
| 最后登录 | 2014-5-12 |  
| 在线时间 | 33 小时 |  
 Lv1.梦旅人 
	梦石0 星屑50 在线时间33 小时注册时间2011-1-18帖子16 | 
| 无视我做的乱七八糟的笔记吧,其实我想问下这里定义的绘制角色头像背景在118行不生效?脚本后面无冲突了。复制代码#==============================================================================
# ■ Window_BattleStatus
#------------------------------------------------------------------------------
# RTAB改了战斗画面类之余增添了Window_ActorStatus和Window_DetailsStatus两个类
#在于更好地控制每一个更新阶段么?但是学习起来会变得十分麻烦
#==============================================================================
class Window_BattleStatus < Window_Base
  #--------------------------------------------------------------------------
  #--------------------------------------------------------------------------
  #                   ★★★设定总体战斗状态栏框架★★★
  #                   改了这里就要注意改了下面的刷新部分
  #--------------------------------------------------------------------------
  #--------------------------------------------------------------------------
  def initialize
    x = (4 - $game_party.actors.size) * 80      
    #1人队伍时在x=240时开始描画,4人则在x=0
    width = $game_party.actors.size * 160
    #窗口宽度为1人160
    #这里是第一个改变点,会根据队伍人数来描绘底框。对比一下新建工程
    #如果队伍不到4人,这个画面会绘制一个窄一点的范围并且居中
    #而默认脚本始终绘制出占用全幅的范围,并且只会从左边开始
    super(x, 320, width, 160)              #调用父类建立视口,高度和Y坐标固定
    self.opacity = 0                       #窗体透明度,不要这个框就设为0 
    self.back_opacity = 160                #背景透明度,嫌蓝色难看就设为0
    @actor_window = []                     #初始化角色窗口
    for i in 0...$game_party.actors.size
      @actor_window.push(Window_ActorStatus.new(i, x + i * 160))
      #逐人描画角色窗口,变量:第几号人、最左端x轴(每个人占用160)
    end
    @level_up_flags = [false, false, false, false]    #初始化升级标识
    refresh
  end
  #--------------------------------------------------------------------------
  # ● 释放窗口
  #--------------------------------------------------------------------------
  def dispose
    for window in @actor_window
      window.dispose       #对每个角色的状态窗口执行释放,下面进行定义
    end
    super                  #调用父类释放整个窗口
  end
  #--------------------------------------------------------------------------
  # ■ 刷新
  #--------------------------------------------------------------------------
  def refresh(number = 0)
    if number == 0
      cnt = 0
      for window in @actor_window
        window.refresh(@level_up_flags[cnt])
        cnt += 1
      end
    else
      @actor_window[number - 1].refresh(@level_up_flags[number - 1])
    end
  end
  #--------------------------------------------------------------------------
  # ● 刷新AT槽
  #--------------------------------------------------------------------------
  def at_refresh(number = 0)
    if number == 0
      for window in @actor_window
        window.at_refresh
      end
    else
      @actor_window[number - 1].at_refresh
    end
  end
  #--------------------------------------------------------------------------
  #              △更新部分,没啥好注意的,改了上面就要改这里△
  #--------------------------------------------------------------------------
  def update
    super
    if self.x != (4 - $game_party.actors.size) * 80
      self.x = (4 - $game_party.actors.size) * 80
      self.width = $game_party.actors.size * 160
      for window in @actor_window
        window.dispose
      end
      @actor_window = []
      for i in 0...$game_party.actors.size
        @actor_window.push(Window_ActorStatus.new(i, x + i * 160))
      end
      refresh
    end
    for window in @actor_window
      window.update
    end
  end
end
#==============================================================================
# ■ Window_ActorStatus
#------------------------------------------------------------------------------
#  分别显示战斗者各种信息状态的窗口
#==============================================================================
class Window_ActorStatus < Window_Base
  #--------------------------------------------------------------------------
  #                       ☆☆☆单个角色状态的描绘☆☆☆
  #--------------------------------------------------------------------------
  def initialize(id, x)
    @actor_num = id
    super(x, 320, 160, 160)
    #设定一个宽高均为160的角色状态视口,有需要就改。不过要结合上面的总窗大小
    self.contents = Bitmap.new(width - 32, height - 32)  
    #内容在内部显示,调教效果不明
    self.opacity = 255                #该窗体透明度,非0时每个角色会套上一个框
    self.back_opacity = 160           #窗体背景透明度,255则被蓝色覆盖
    actor = $game_party.actors[@actor_num]
    @actor_nm = actor.name
    @actor_mhp = actor.maxhp
    @actor_msp = actor.maxsp
    @actor_hp = actor.hp
    @actor_sp = actor.sp
    @actor_st = make_battler_state_text(actor, 120, true)
    #获取角色数据,如有需要则在此添加类变量
    draw_a_background(x,actor.id)     #增添描绘头像功能
    #--------------------------------------------------------------#
    #                        基本窗口描绘完毕                      #
    #--------------------------------------------------------------#
    @status_window = []       #初始化状态信息数组
    for i in 0...5           
      #从0号到4号分别描绘各种状态,0号对应名字,3号对应状态(升级),4号对应AT
      @status_window.push(Window_DetailsStatus.new(actor, i, x))
    #逐项描绘状态窗口里的信息,如果要加则增加上面的5前提是在下面有设定好内容
    #如果要添加,dispose、reflash等内容都要注意更改 
    #为每个角色个头像图片什么的,没有必要在Window_DetailsStatus里加因为很麻烦!
    end
    refresh(false)       #执行刷新
  end
  #--------------------------------------------------------------------------
  # 如果添加了信息数量,那么这里也要增加
  #--------------------------------------------------------------------------
  def dispose
    for i in 0...5                #改这个
      @status_window[i].dispose   #逐条信息释放 
    end
    super                         #释放整个视口,包括上面那个底框
  end
  #--------------------------------------------------------------------------
  #                            ※刷新状态信息※
  #               我的猜想是,没有随战斗动态变化的内容不需要在这里写
  #     例如名字,这里其实不需要刷新的(但考虑到有人会用事件把别人名字改了)
  #--------------------------------------------------------------------------
  def refresh(level_up_flags)
    self.contents.clear
    actor = $game_party.actors[@actor_num]
    @status_window[0].refresh(actor) if @actor_nm != actor.name
    @status_window[1].refresh(actor) if
      @actor_mhp != actor.maxhp or @actor_hp != actor.hp
    @status_window[2].refresh(actor) if
      @actor_msp != actor.maxsp or @actor_sp != actor.sp
    @status_window[3].refresh(actor, level_up_flags) if
      @actor_st != make_battler_state_text(actor, 120, true) or level_up_flags
    @actor_nm = actor.name
    @actor_mhp = actor.maxhp
    @actor_msp = actor.maxsp
    @actor_hp = actor.hp
    @actor_sp = actor.sp
    @actor_st = make_battler_state_text(actor, 120, true)
  end
  #--------------------------------------------------------------------------
  #     AT槽的刷新向来是独立处理的,因为RTAB里,AT槽刷新时点跟HP等数值不同?
  #--------------------------------------------------------------------------
  def at_refresh
    @status_window[4].refresh($game_party.actors[@actor_num])
  end
  #--------------------------------------------------------------------------
  #            由于统一帮你定义了更新所以添加新东西不需要改这里
  #--------------------------------------------------------------------------
  def update
    for window in @status_window
      window.update
    end
  end
  #--------------------------------------------------------------------------
  #                 定义绘制角色头像背景的方法
  #--------------------------------------------------------------------------
  def draw_a_background(x,id)
    background = (RPG::Cache.picture("battler_"+id.to_s)== nil ? RPG::Cache.picture("") : RPG::Cache.picture("battler_"+id.to_s))
    cw = background.width
    ch = background.height
    rect = Rect.new(0,0,cw,ch)
    self.contents.blt(x , 320 , background ,rect ) 
    self.opacity = 255
  end
end  
#==============================================================================
# ■ Window_DetailsStatus
#------------------------------------------------------------------------------
#  バトル画面でアクターのステータスを個々に表示するウィンドウです。
#        战斗图其实不包含在这个内容里面!去Sprite_Battler找!
#==============================================================================
class Window_DetailsStatus < Window_Base
  #--------------------------------------------------------------------------
  #            逐项描画项目,注意每项都会自动下拉26像素,方便设定
  #                但这样排布的画面比较死板,建议首先动刀 
  #--------------------------------------------------------------------------
  def initialize(actor, id, x)
    @status_id = id
    super(x, 320 + id * 26, 160, 64)
    self.contents = Bitmap.new(width - 32, height - 32)
    self.opacity = 0
    self.back_opacity = 0
    #背景和窗体透明均设为0,这里没必要改否则画面很零碎
    refresh(actor, false)       
  end
  #--------------------------------------------------------------------------
  # ● 解放
  #--------------------------------------------------------------------------
  def dispose
    super
  end
  #--------------------------------------------------------------------------
  #                           ■■■刷新■■■
  #                           重点改造对象之一
  #--------------------------------------------------------------------------
  def refresh(actor, level_up_flags = false)
    self.contents.clear        #清空掉上一帧的内容
    case @status_id            #根据要描绘的指示返回内容
    when 0                     #0号对应名字
      draw_actor_name(actor, 4, 0)
    when 1                     #1号对应HP,如果用了血槽插件这个部分被重新定义
      draw_actor_hp(actor, 4, 0, 120)
    when 2                     #2号对应SP,如果用了血槽插件这个部分被重新定义
      draw_actor_sp(actor, 4, 0, 120)
    when 3                     #3号对应状态槽和升级标识
      if level_up_flags
        self.contents.font.color = normal_color
        self.contents.draw_text(4, 0, 120, 32, "LEVEL UP!")
      else                     #通常接收到的都是level_up_flags = false,于是
                               #平时显示状态 
        draw_actor_state(actor, 4, 0)
      end
    when 4                     #4号对应AT槽
      draw_actor_atg(actor, 4, 0, 120)
    end
  end
  #--------------------------------------------------------------------------
  # ● フレーム更新
  #--------------------------------------------------------------------------
  def update
    # 在主回合阶段稍微下降透明度,改这里能使得透明度变化速率和范围发生变化
    if $game_temp.battle_main_phase
      self.contents_opacity -= 4 if self.contents_opacity > 191
    else
      self.contents_opacity += 4 if self.contents_opacity < 255
    end
  end
end
 | 
 |