设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 1026|回复: 0
打印 上一主题 下一主题

[已经过期] 【XP】RTAB系统下的战斗画面改造学习

[复制链接]

Lv1.梦旅人

梦石
0
星屑
50
在线时间
33 小时
注册时间
2011-1-18
帖子
16
跳转到指定楼层
1
发表于 2012-1-10 19:34:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. #==============================================================================
  2. # ■ Window_BattleStatus
  3. #------------------------------------------------------------------------------
  4. # RTAB改了战斗画面类之余增添了Window_ActorStatus和Window_DetailsStatus两个类
  5. #在于更好地控制每一个更新阶段么?但是学习起来会变得十分麻烦
  6. #==============================================================================

  7. class Window_BattleStatus < Window_Base
  8.   #--------------------------------------------------------------------------
  9.   #--------------------------------------------------------------------------
  10.   #                   ★★★设定总体战斗状态栏框架★★★
  11.   #                   改了这里就要注意改了下面的刷新部分
  12.   #--------------------------------------------------------------------------
  13.   #--------------------------------------------------------------------------
  14.   def initialize
  15.     x = (4 - $game_party.actors.size) * 80      
  16.     #1人队伍时在x=240时开始描画,4人则在x=0
  17.     width = $game_party.actors.size * 160
  18.     #窗口宽度为1人160
  19.     #这里是第一个改变点,会根据队伍人数来描绘底框。对比一下新建工程
  20.     #如果队伍不到4人,这个画面会绘制一个窄一点的范围并且居中
  21.     #而默认脚本始终绘制出占用全幅的范围,并且只会从左边开始
  22.     super(x, 320, width, 160)              #调用父类建立视口,高度和Y坐标固定
  23.     self.opacity = 0                       #窗体透明度,不要这个框就设为0
  24.     self.back_opacity = 160                #背景透明度,嫌蓝色难看就设为0
  25.     @actor_window = []                     #初始化角色窗口
  26.     for i in 0...$game_party.actors.size
  27.       @actor_window.push(Window_ActorStatus.new(i, x + i * 160))
  28.       #逐人描画角色窗口,变量:第几号人、最左端x轴(每个人占用160)
  29.     end
  30.     @level_up_flags = [false, false, false, false]    #初始化升级标识
  31.     refresh
  32.   end
  33.   #--------------------------------------------------------------------------
  34.   # ● 释放窗口
  35.   #--------------------------------------------------------------------------
  36.   def dispose
  37.     for window in @actor_window
  38.       window.dispose       #对每个角色的状态窗口执行释放,下面进行定义
  39.     end
  40.     super                  #调用父类释放整个窗口
  41.   end
  42.   #--------------------------------------------------------------------------
  43.   # ■ 刷新
  44.   #--------------------------------------------------------------------------
  45.   def refresh(number = 0)
  46.     if number == 0
  47.       cnt = 0
  48.       for window in @actor_window
  49.         window.refresh(@level_up_flags[cnt])
  50.         cnt += 1
  51.       end
  52.     else
  53.       @actor_window[number - 1].refresh(@level_up_flags[number - 1])
  54.     end
  55.   end
  56.   #--------------------------------------------------------------------------
  57.   # ● 刷新AT槽
  58.   #--------------------------------------------------------------------------
  59.   def at_refresh(number = 0)
  60.     if number == 0
  61.       for window in @actor_window
  62.         window.at_refresh
  63.       end
  64.     else
  65.       @actor_window[number - 1].at_refresh
  66.     end
  67.   end
  68.   #--------------------------------------------------------------------------
  69.   #              △更新部分,没啥好注意的,改了上面就要改这里△
  70.   #--------------------------------------------------------------------------
  71.   def update
  72.     super
  73.     if self.x != (4 - $game_party.actors.size) * 80
  74.       self.x = (4 - $game_party.actors.size) * 80
  75.       self.width = $game_party.actors.size * 160
  76.       for window in @actor_window
  77.         window.dispose
  78.       end
  79.       @actor_window = []
  80.       for i in 0...$game_party.actors.size
  81.         @actor_window.push(Window_ActorStatus.new(i, x + i * 160))
  82.       end
  83.       refresh
  84.     end
  85.     for window in @actor_window
  86.       window.update
  87.     end
  88.   end
  89. end

  90. #==============================================================================
  91. # ■ Window_ActorStatus
  92. #------------------------------------------------------------------------------
  93. #  分别显示战斗者各种信息状态的窗口
  94. #==============================================================================

  95. class Window_ActorStatus < Window_Base
  96.   #--------------------------------------------------------------------------
  97.   #                       ☆☆☆单个角色状态的描绘☆☆☆
  98.   #--------------------------------------------------------------------------
  99.   def initialize(id, x)
  100.     @actor_num = id
  101.     super(x, 320, 160, 160)
  102.     #设定一个宽高均为160的角色状态视口,有需要就改。不过要结合上面的总窗大小
  103.     self.contents = Bitmap.new(width - 32, height - 32)  
  104.     #内容在内部显示,调教效果不明
  105.     self.opacity = 255                #该窗体透明度,非0时每个角色会套上一个框
  106.     self.back_opacity = 160           #窗体背景透明度,255则被蓝色覆盖
  107.     actor = $game_party.actors[@actor_num]
  108.     @actor_nm = actor.name
  109.     @actor_mhp = actor.maxhp
  110.     @actor_msp = actor.maxsp
  111.     @actor_hp = actor.hp
  112.     @actor_sp = actor.sp
  113.     @actor_st = make_battler_state_text(actor, 120, true)
  114.     #获取角色数据,如有需要则在此添加类变量
  115.     draw_a_background(x,actor.id)     #增添描绘头像功能
  116.     #--------------------------------------------------------------#
  117.     #                        基本窗口描绘完毕                      #
  118.     #--------------------------------------------------------------#
  119.     @status_window = []       #初始化状态信息数组
  120.     for i in 0...5           
  121.       #从0号到4号分别描绘各种状态,0号对应名字,3号对应状态(升级),4号对应AT
  122.       @status_window.push(Window_DetailsStatus.new(actor, i, x))
  123.     #逐项描绘状态窗口里的信息,如果要加则增加上面的5前提是在下面有设定好内容
  124.     #如果要添加,dispose、reflash等内容都要注意更改
  125.     #为每个角色个头像图片什么的,没有必要在Window_DetailsStatus里加因为很麻烦!
  126.     end
  127.     refresh(false)       #执行刷新
  128.   end
  129.   #--------------------------------------------------------------------------
  130.   # 如果添加了信息数量,那么这里也要增加
  131.   #--------------------------------------------------------------------------
  132.   def dispose
  133.     for i in 0...5                #改这个
  134.       @status_window[i].dispose   #逐条信息释放
  135.     end
  136.     super                         #释放整个视口,包括上面那个底框
  137.   end
  138.   #--------------------------------------------------------------------------
  139.   #                            ※刷新状态信息※
  140.   #               我的猜想是,没有随战斗动态变化的内容不需要在这里写
  141.   #     例如名字,这里其实不需要刷新的(但考虑到有人会用事件把别人名字改了)
  142.   #--------------------------------------------------------------------------
  143.   def refresh(level_up_flags)
  144.     self.contents.clear
  145.     actor = $game_party.actors[@actor_num]
  146.     @status_window[0].refresh(actor) if @actor_nm != actor.name
  147.     @status_window[1].refresh(actor) if
  148.       @actor_mhp != actor.maxhp or @actor_hp != actor.hp
  149.     @status_window[2].refresh(actor) if
  150.       @actor_msp != actor.maxsp or @actor_sp != actor.sp
  151.     @status_window[3].refresh(actor, level_up_flags) if
  152.       @actor_st != make_battler_state_text(actor, 120, true) or level_up_flags
  153.     @actor_nm = actor.name
  154.     @actor_mhp = actor.maxhp
  155.     @actor_msp = actor.maxsp
  156.     @actor_hp = actor.hp
  157.     @actor_sp = actor.sp
  158.     @actor_st = make_battler_state_text(actor, 120, true)
  159.   end
  160.   #--------------------------------------------------------------------------
  161.   #     AT槽的刷新向来是独立处理的,因为RTAB里,AT槽刷新时点跟HP等数值不同?
  162.   #--------------------------------------------------------------------------
  163.   def at_refresh
  164.     @status_window[4].refresh($game_party.actors[@actor_num])
  165.   end
  166.   #--------------------------------------------------------------------------
  167.   #            由于统一帮你定义了更新所以添加新东西不需要改这里
  168.   #--------------------------------------------------------------------------
  169.   def update
  170.     for window in @status_window
  171.       window.update
  172.     end
  173.   end
  174.   #--------------------------------------------------------------------------
  175.   #                 定义绘制角色头像背景的方法
  176.   #--------------------------------------------------------------------------
  177.   def draw_a_background(x,id)
  178.     background = (RPG::Cache.picture("battler_"+id.to_s)== nil ? RPG::Cache.picture("") : RPG::Cache.picture("battler_"+id.to_s))
  179.     cw = background.width
  180.     ch = background.height
  181.     rect = Rect.new(0,0,cw,ch)
  182.     self.contents.blt(x , 320 , background ,rect )
  183.     self.opacity = 255
  184.   end
  185. end  
  186. #==============================================================================
  187. # ■ Window_DetailsStatus
  188. #------------------------------------------------------------------------------
  189. #  バトル画面でアクターのステータスを個々に表示するウィンドウです。
  190. #        战斗图其实不包含在这个内容里面!去Sprite_Battler找!
  191. #==============================================================================

  192. class Window_DetailsStatus < Window_Base
  193.   #--------------------------------------------------------------------------
  194.   #            逐项描画项目,注意每项都会自动下拉26像素,方便设定
  195.   #                但这样排布的画面比较死板,建议首先动刀
  196.   #--------------------------------------------------------------------------
  197.   def initialize(actor, id, x)
  198.     @status_id = id
  199.     super(x, 320 + id * 26, 160, 64)
  200.     self.contents = Bitmap.new(width - 32, height - 32)
  201.     self.opacity = 0
  202.     self.back_opacity = 0
  203.     #背景和窗体透明均设为0,这里没必要改否则画面很零碎
  204.     refresh(actor, false)      
  205.   end
  206.   #--------------------------------------------------------------------------
  207.   # ● 解放
  208.   #--------------------------------------------------------------------------
  209.   def dispose
  210.     super
  211.   end
  212.   #--------------------------------------------------------------------------
  213.   #                           ■■■刷新■■■
  214.   #                           重点改造对象之一
  215.   #--------------------------------------------------------------------------
  216.   def refresh(actor, level_up_flags = false)
  217.     self.contents.clear        #清空掉上一帧的内容
  218.     case @status_id            #根据要描绘的指示返回内容
  219.     when 0                     #0号对应名字
  220.       draw_actor_name(actor, 4, 0)
  221.     when 1                     #1号对应HP,如果用了血槽插件这个部分被重新定义
  222.       draw_actor_hp(actor, 4, 0, 120)
  223.     when 2                     #2号对应SP,如果用了血槽插件这个部分被重新定义
  224.       draw_actor_sp(actor, 4, 0, 120)
  225.     when 3                     #3号对应状态槽和升级标识
  226.       if level_up_flags
  227.         self.contents.font.color = normal_color
  228.         self.contents.draw_text(4, 0, 120, 32, "LEVEL UP!")
  229.       else                     #通常接收到的都是level_up_flags = false,于是
  230.                                #平时显示状态
  231.         draw_actor_state(actor, 4, 0)
  232.       end
  233.     when 4                     #4号对应AT槽
  234.       draw_actor_atg(actor, 4, 0, 120)
  235.     end
  236.   end
  237.   #--------------------------------------------------------------------------
  238.   # ● フレーム更新
  239.   #--------------------------------------------------------------------------
  240.   def update
  241.     # 在主回合阶段稍微下降透明度,改这里能使得透明度变化速率和范围发生变化
  242.     if $game_temp.battle_main_phase
  243.       self.contents_opacity -= 4 if self.contents_opacity > 191
  244.     else
  245.       self.contents_opacity += 4 if self.contents_opacity < 255
  246.     end
  247.   end
  248. end
复制代码
无视我做的乱七八糟的笔记吧,其实我想问下这里定义的绘制角色头像背景在118行不生效?脚本后面无冲突了。
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2025-7-21 02:33

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表