Project1

标题: 角色狀態的排序以及描畫 [打印本页]

作者: LabLamb    时间: 2012-12-23 10:03
标题: 角色狀態的排序以及描畫
本帖最后由 LabLamb 于 2012-12-23 10:05 编辑
  1. #encoding:utf-8
  2. #==============================================================================
  3. # ■ Window_Status
  4. #------------------------------------------------------------------------------
  5. #  状态画面中,显示角色基本信息的窗口。
  6. #==============================================================================

  7. class Window_Status < Window_Selectable
  8.   #--------------------------------------------------------------------------
  9.   # ● 初始化对象
  10.   #--------------------------------------------------------------------------
  11.   def initialize(actor)
  12.     super(0, 0, Graphics.width, Graphics.height)
  13.     [url=home.php?mod=space&uid=95897]@actor[/url] = actor
  14.     refresh
  15.     activate
  16.   end
  17.   #--------------------------------------------------------------------------
  18.   # ● 设置角色
  19.   #--------------------------------------------------------------------------
  20.   def actor=(actor)
  21.     return if [url=home.php?mod=space&uid=95897]@actor[/url] == actor
  22.     [url=home.php?mod=space&uid=95897]@actor[/url] = actor
  23.     refresh
  24.   end
  25.   #--------------------------------------------------------------------------
  26.   # ● 刷新
  27.   #--------------------------------------------------------------------------
  28.   def refresh
  29.     contents.clear
  30. #    draw_block1   (line_height * 0)
  31. #    draw_horz_line(line_height * 1)
  32.     draw_block2   (line_height * 0)
  33.     draw_horz_line(line_height * 4)
  34. #   draw_block3   (line_height * 7)
  35. #   draw_horz_line(line_height * 13)
  36. #    draw_block4   (line_height * 14)
  37.   end
  38.   #--------------------------------------------------------------------------
  39.   # ● 绘制区域 1
  40.   #--------------------------------------------------------------------------
  41. #  def draw_block1(y)
  42. #    draw_actor_name(@actor, 4, y)
  43. #    draw_actor_class(@actor, 128, y)
  44. #    draw_actor_nickname(@actor, 288, y)
  45. #  end
  46.   #--------------------------------------------------------------------------
  47.   # ● 绘制区域 2
  48.   #--------------------------------------------------------------------------
  49.   def draw_block2(y)
  50.     draw_actor_face(@actor, 8, y)
  51.     draw_basic_info(136, y)
  52. #    draw_exp_info(304, y)
  53.   end
  54.   #--------------------------------------------------------------------------
  55.   # ● 绘制区域 3
  56.   #--------------------------------------------------------------------------
  57. #  def draw_block3(y)
  58. #    draw_parameters(32, y)
  59. #    draw_equipments(288, y)
  60. #  end
  61.   #--------------------------------------------------------------------------
  62.   # ● 绘制区域 4
  63.   #--------------------------------------------------------------------------
  64. #  def draw_block4(y)
  65. #    draw_description(4, y)
  66. #  end
  67.   #--------------------------------------------------------------------------
  68.   # ● 绘制水平线
  69.   #--------------------------------------------------------------------------
  70.   def draw_horz_line(y)
  71.     line_y = y + line_height / 2 - 1
  72.     contents.fill_rect(0, line_y, contents_width, 2, line_color)
  73.   end
  74.   #--------------------------------------------------------------------------
  75.   # ● 获取水平线的颜色
  76.   #--------------------------------------------------------------------------
  77.   def line_color
  78.     color = normal_color
  79.     color.alpha = 48
  80.     color
  81.   end
  82.   #--------------------------------------------------------------------------
  83.   # ● 绘制基本信息
  84.   #--------------------------------------------------------------------------
  85.   def draw_basic_info(x, y)
  86.     draw_actor_name(@actor, x-2, line_height - 24)
  87.     draw_actor_class(@actor, x-2, line_height)
  88.     draw_actor_icons(@actor, x, y + line_height * 0)
  89.     draw_actor_hp(@actor, x, y + line_height * 2)
  90.     draw_actor_mp(@actor, x, y + line_height * 3)
  91.     draw_parameters(200, y)
  92.     draw_equipments(420, y)
  93.   end
  94.   #--------------------------------------------------------------------------
  95.   # ● 绘制能力值
  96.   #--------------------------------------------------------------------------
  97. #  def draw_parameters(x, y)
  98. #    6.times {|i| draw_actor_param(@actor, x, y + line_height * i, i + 2) }
  99. #  end
  100.   #--------------------------------------------------------------------------
  101.   # ● 绘制经验值信息
  102.   #--------------------------------------------------------------------------
  103. #  def draw_exp_info(x, y)
  104. #    s1 = @actor.max_level? ? "-------" : @actor.exp
  105. #    s2 = @actor.max_level? ? "-------" : @actor.next_level_exp - @actor.exp
  106. #    s_next = sprintf(Vocab::ExpNext, Vocab::level)
  107. #    change_color(system_color)
  108. #    draw_text(x, y + line_height * 0, 180, line_height, Vocab::ExpTotal)
  109. #    draw_text(x, y + line_height * 2, 180, line_height, s_next)
  110. #    change_color(normal_color)
  111. #    draw_text(x, y + line_height * 1, 180, line_height, s1, 2)
  112. #    draw_text(x, y + line_height * 3, 180, line_height, s2, 2)
  113. #  end
  114.   #--------------------------------------------------------------------------
  115.   # ● 绘制装备
  116.   #--------------------------------------------------------------------------
  117.   def draw_equipments(x, y)
  118.     @actor.equips.each_with_index do |item, i|
  119.       draw_item_name(item, x, y + line_height * i)
  120.     end
  121.   end
  122.   #--------------------------------------------------------------------------
  123.   # ● 绘制说明
  124.   #--------------------------------------------------------------------------
  125. #  def draw_description(x, y)
  126. #    draw_text_ex(x, y, @actor.description)
  127. #  end
  128. end
复制代码
  1. #==============================================================================
  2. # ■ Window_Base
  3. #------------------------------------------------------------------------------
  4. #  ゲーム中の全てのウィンドウのスーパークラスです。
  5. #==============================================================================

  6. class Window_Base < Window
  7.   #--------------------------------------------------------------------------
  8.   # ● 能力値の描画
  9.   #--------------------------------------------------------------------------
  10.   alias dont_draw_m_draw_actor_param draw_actor_param
  11.   def draw_actor_param(actor, x, y, param_id)
  12.     # 当属性ID是4和5(代表魔攻和魔防)时不进行处理
  13.     return if [4,5,7].include?(param_id)
  14.     dont_draw_m_draw_actor_param(actor,x,y,param_id)
  15.   end
  16. end
  17. #==============================================================================
  18. # ■ Window_EquipStatus
  19. #------------------------------------------------------------------------------
  20. #  装備画面で、アクターの能力値変化を表示するウィンドウです。
  21. #==============================================================================

  22. class Window_EquipStatus < Window_Base
  23.   #--------------------------------------------------------------------------
  24.   # ● リフレッシュ
  25.   #--------------------------------------------------------------------------
  26.   def refresh
  27.     contents.clear
  28.     draw_actor_name(@actor, 4, 0) if @actor
  29.     # 执行属性ID为2,3,6,7的属性的绘制
  30.     [0,1,4,5].each_with_index{|i,ii| draw_item(0, line_height * (1 + ii), 2 + i) } # 这里的2+i 表示属性ID
  31.   end
  32. end
  33. #==============================================================================
  34. # ■ Window_Status
  35. #------------------------------------------------------------------------------
  36. #  ステータス画面で表示する、フル仕様のステータスウィンドウです。
  37. #==============================================================================

  38. class Window_Status < Window_Selectable
  39.   #--------------------------------------------------------------------------
  40.   # ● 能力値の描画
  41.   #--------------------------------------------------------------------------
  42.   def draw_parameters(x, y)
  43.     # 同上
  44.     [0,1,4,5].each_with_index do |i,ii|
  45.       draw_actor_param(@actor, x, y + line_height * ii, i + 2)
  46.     end
  47.   end
  48. end
复制代码
以上第一段是經我自己改造的內置角色狀態視窗,
第二段是版友@feizhaodan 替我編寫,用以刪除狀態中的「魔攻」、「魔防」及「幸運」目前樣子是:


我想問如何更改以下幾項:

一、屬性 <--> 數值 之間的距離,在圖中可見,因為屬性名字跟數值距離太大,導致顯示得非常怪異,文字重疊等等。

二、裝備的Y間距。基本上問題跟(一)一樣,由於裝備類型有五件,所以間距應該是這一個角色的狀態Y除以5,可是我不知道怎樣改寫內置的腳本。

三、讓這個介面同時顯視四個角色。在圖中可見,紫色男角只佔用了視窗的四分一(應該差不多),我是想把整個隊伍(一頁顯示四人)放進去,我有想過將預設主選單中的隊伍狀態直接搬運,可是實行起來不斷彈出Error而我又不知道如何解決。

由於我接觸了RMVA不久,所以麻煩各位寫腳本的高手可以指點一下,謝謝。   
作者: LabLamb    时间: 2012-12-23 17:25
自推一下,求救 :(
作者: acn00269    时间: 2012-12-23 22:01
目前还没有这方面的经验,不常改过状态栏。。
跑题了,你可以试试全局搜索Ctrl+Shift+F,搜索攻击这俩字,可能就会找到位置数据什么的吧
作者: j433463    时间: 2012-12-24 02:25
基本上,这些状态栏内的东西大多是在 Window_Base 中做的,像血量,经验值,条槽和状态图示等的绘制都是在这个默认脚本处理,可是这脚本把默认的都搬过来改了,看得眼花花,有点凌乱啊!

原以为是跟 def draw_parameters(x, y) 有关,可是它被注解了,最底下那个  能力値の描画 没试不知道有没有关连.......
作者: LabLamb    时间: 2012-12-24 08:35
還是想不到如何解決,自推一下。
作者: 345912390    时间: 2012-12-24 16:55
不知道你要的是不是这样的效果

如果是,就用以下脚本替换Window_MenuStatus
  1. #encoding:utf-8
  2. #==============================================================================
  3. # ■ Window_MenuStatus
  4. #------------------------------------------------------------------------------
  5. #  菜单画面中,显示队伍成员状态的窗口
  6. #==============================================================================

  7. class Window_MenuStatus < Window_Selectable
  8.   #--------------------------------------------------------------------------
  9.   # ● 定义实例变量
  10.   #--------------------------------------------------------------------------
  11.   attr_reader   :pending_index            # 保留位置(整队用)
  12.   #--------------------------------------------------------------------------
  13.   # ● 初始化对象
  14.   #--------------------------------------------------------------------------
  15.   def initialize(x, y)
  16.     super(x, y, window_width, window_height)
  17.     @pending_index = -1
  18.     refresh
  19.   end
  20.   #--------------------------------------------------------------------------
  21.   # ● 获取窗口的宽度
  22.   #--------------------------------------------------------------------------
  23.   def window_width
  24.     Graphics.width - 160
  25.   end
  26.   #--------------------------------------------------------------------------
  27.   # ● 获取窗口的高度
  28.   #--------------------------------------------------------------------------
  29.   def window_height
  30.     Graphics.height
  31.   end
  32.   #--------------------------------------------------------------------------
  33.   # ● 获取项目数
  34.   #--------------------------------------------------------------------------
  35.   def item_max
  36.     $game_party.members.size
  37.   end
  38.   #--------------------------------------------------------------------------
  39.   # ● 获取项目的高度
  40.   #--------------------------------------------------------------------------
  41.   def item_height
  42.     (height - standard_padding * 2) / 4
  43.   end
  44.   #--------------------------------------------------------------------------
  45.   # ● 绘制项目
  46.   #--------------------------------------------------------------------------
  47.   def draw_item(index)
  48.     actor = $game_party.members[index]
  49.     enabled = $game_party.battle_members.include?(actor)
  50.     rect = item_rect(index)
  51.     draw_item_background(index)
  52.     draw_actor_face(actor, rect.x + 1, rect.y + 1, enabled)
  53.     draw_actor_simple_status(actor, rect.x + 108, rect.y)# + line_height / 2)
  54.   end
  55.   #--------------------------------------------------------------------------
  56.   # ● 绘制项目的背景
  57.   #--------------------------------------------------------------------------
  58.   def draw_item_background(index)
  59.     if index == @pending_index
  60.       contents.fill_rect(item_rect(index), pending_color)
  61.     end
  62.   end
  63.   #--------------------------------------------------------------------------
  64.   # ● 按下确定键时的处理
  65.   #--------------------------------------------------------------------------
  66.   def process_ok
  67.     super
  68.     $game_party.menu_actor = $game_party.members[index]
  69.   end
  70.   #--------------------------------------------------------------------------
  71.   # ● 返回上一个选择的位置
  72.   #--------------------------------------------------------------------------
  73.   def select_last
  74.     select($game_party.menu_actor.index || 0)
  75.   end
  76.   #--------------------------------------------------------------------------
  77.   # ● 设置保留位置(整队用)
  78.   #--------------------------------------------------------------------------
  79.   def pending_index=(index)
  80.     last_pending_index = @pending_index
  81.     @pending_index = index
  82.     redraw_item(@pending_index)
  83.     redraw_item(last_pending_index)
  84.   end
  85.   #--------------------------------------------------------------------------
  86.   # ● 绘制简单的状态
  87.   #--------------------------------------------------------------------------
  88.   def draw_actor_simple_status(actor, x, y)
  89.     draw_actor_name(actor, x, y)
  90.     draw_actor_class(actor, x,y + line_height * 1)
  91.     draw_actor_hp(actor, x, y + line_height * 2,112)
  92.     draw_actor_mp(actor, x, y + line_height * 3,112)
  93.     draw_actor_param(actor, x+112, y, 2)
  94.     draw_actor_param(actor, x+112, y+ line_height * 1, 3)
  95.     draw_actor_param(actor, x+112, y+ line_height * 2, 4)
  96.     draw_actor_param(actor, x+112, y+ line_height * 3, 5)
  97.     draw_equipments(actor,x+212, y)
  98.   end
  99.    #--------------------------------------------------------------------------
  100.   # ● 绘制能力值
  101.   #--------------------------------------------------------------------------
  102.   def draw_actor_param(actor, x, y, param_id)
  103.     change_color(system_color)
  104.     draw_text(x, y,100, line_height, Vocab::param(param_id))
  105.     change_color(normal_color)
  106.     draw_text(x, y,100, line_height, actor.param(param_id), 2)
  107.   end
  108.   #--------------------------------------------------------------------------
  109.   # ● 绘制装备
  110.   #--------------------------------------------------------------------------
  111.   def draw_equipments(actor,x, y)
  112.     actor.equips.each_with_index do |item, i|
  113.       draw_item_name(item, x, y + line_height * i)
  114.     end
  115.   end
  116. end
复制代码

作者: 345912390    时间: 2012-12-24 19:52
@LabLamb 放在Window_Status裡面又何苦挤在一起
其实很简单,懒得弄了,自己参考着改吧!
作者: LabLamb    时间: 2012-12-25 09:37
@345912390
不明白為甚麼會是「擠」在一起,那頁佔了整個遊戲畫面,空間很充裕,看起來也很舒服,跟放在主選單差很遠吧。
作者: j433463    时间: 2012-12-25 15:50
本帖最后由 j433463 于 2012-12-25 15:55 编辑

放大分辨率就可以看起来比较空了,像我的游戏实际大小 768*576 界面看起来就没那么挤:



状态页还要为了不显得太空,花心思去弄立绘图,修修改改的补全所有角色的立绘当背景:



楼主想一页几个角色状态一起显示这念头我也动过,只是后来考虑角色队伍变更时状态页要不要也变更?

这么一样就放弃了。

而且,那些挤在一起的状态资料中少了经验值,这个我就不想省掉,还有状态图标 Icon 啊!都放不进去,太挤了,

宁可放大窗口,然后把图一个个改大,战斗图,背景,标题图,立绘.......现在想想,好像更累,但效果觉得不错。
作者: LabLamb    时间: 2012-12-25 16:47
其實要不是我缺了三頁屬性、等級之類的數值我還是會用原本的狀態,可惜我目前在作的遊戲還是想一切從簡。倒是有點本末倒置,想弄得比較簡單的遊戲卻更花時間弄腳本。
作者: j433463    时间: 2012-12-25 18:39
本帖最后由 j433463 于 2012-12-25 19:05 编辑

找到原因了,先看看修正后的样子再来讲哪儿有问题:



应该是这样没错吧?物攻物防和敏捷这些确实是之前猜测的脚本最后那个有关,
但作怪的不是楼主的脚本,而是原来默认脚本。

首先,位置之所以跑到血槽条那边,是因为在楼主给的 Window_Status 第 92 行 x 值给的不好,

draw_parameters(200, y)

我把 200 改成了 270,就到图上的位置,但物攻物防中文与数字隔得太宽,这并不是楼主脚本的问题,
因为楼主的脚本把它的那一段注解了,以至于在楼主脚本中怎么查都不对。

本来我以为楼主脚本是把默认脚本删除,用新脚本取代,起初没注意,但测试时不对,会跳出错误框,
只好把原来的默认脚本补回去,新脚本放在 Main 上面,想一想,既然这样,找找看默认脚本吧。

果然,把默认脚本 Window_Base 的 def draw_actor_param 那一段中,最后的

draw_text(x + 120, y, 36, line_height, actor.param(param_id), 2)

把 x + 120 改成 x + 80, 间距缩小了,如图正常了。

果然,实测才是解决之道,用看的始终不保证100%看明白,开新工程实测,只耗时不到一小时。
作者: LabLamb    时间: 2012-12-25 19:09
本帖最后由 LabLamb 于 2012-12-25 19:42 编辑
j433463 发表于 2012-12-25 18:39
找到原因了,先看看修正后的样子再来讲哪儿有问题:


原來是Window Base,謝謝你,太棒了!





然後裝備名太長就會發生這樣的悲劇 XD
作者: LabLamb    时间: 2012-12-25 21:13
[attach]145455[/attach]

最後調整,不過裝備的Y軸不知道如何改,因為它又用了複雜的算式來代替編寫。
  1. def draw_equipments(x, y)
  2.     @actor.equips.each_with_index do |item, i|
  3.       draw_item_name(item, x, y + line_height * i)
  4.     end
  5.   end
复制代码
然後到底要如何整隊都放進去呢?我又去研究Team_Status了。

Awesome.jpg (44.93 KB, 下载次数: 32)

Awesome.jpg

作者: LabLamb    时间: 2013-1-2 18:09
虛心求教,先推。




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1