Project1

标题: 关于状态图标化 [打印本页]

作者: 紫英晓狼1130    时间: 2013-4-22 05:57
标题: 关于状态图标化
用的是以下脚本
问题是当它的y坐标在上面能把图标都显示出来
但是再把y坐标向下改,图标只显示出一半,已经超出了它能显示的范围
这个怎么改?
问题浏览图:

脚本:
RUBY 代码复制
  1. #==============================================================================
  2. # Date 12-31-2005
  3. # 重定义类:Window_Base, Window_Help
  4. #==============================================================================
  5. # 脚本功能:
  6. # 实现战斗中和菜单中用图标显示状态,代替原来的文字显示。
  7. # 默认最多同时显示5个状态
  8. #------------------------------------------------------------------------------
  9. # 设置方法:
  10. # 一个状态对应的图标文件名为“状态的动画ID.png”
  11. # 例如某状态的动画ID为50,那么它的图标就是“Icons\50.png”
  12. # 如果找不到对应的文件,会报错
  13. #==============================================================================
  14.  
  15. # 注意,在ICON_STATE_IDS中写上需要带图标的状态ID
  16. # ICON_STATE_IDS是一个数组,数组的方法请参考帮助文件
  17. # 例如:
  18. # 只要1,5,8号状态带图标,就这样:ICON_STATE_IDS = [1,5,8]
  19. # 要20到50号状态带图标:ICON_STATE_IDS = 20..50
  20.  
  21. ICON_STATE_IDS = [2,3]
  22.  
  23. #==============================================================================
  24. # ■ Window_Base
  25. #------------------------------------------------------------------------------
  26. #  游戏中全部窗口的超级类。
  27. #==============================================================================
  28.  
  29. class Window_Base < Window
  30. #--------------------------------------------------------------------------
  31. # ● 描绘状态
  32. #     actor : 角色
  33. #     x     : 描画目标 X 坐标
  34. #     y     : 描画目标 Y 坐标
  35. #     width : 描画目标的宽
  36. #--------------------------------------------------------------------------
  37. def draw_actor_state(actor, x, y, width = 120)
  38.   state_size = 0
  39.   for state in actor.states
  40.     # 图标数量超出宽度就中断循环
  41.     if state_size >= width / 1
  42.       break
  43.     end
  44.     # 此状态不带图标就跳过
  45.     if !ICON_STATE_IDS.include?(state)
  46.       next
  47.     end
  48.     bitmap = RPG::Cache.icon($data_states[state].name + "_sta.png")
  49.     if actor.states_turn[state] >= $data_states[state].hold_turn/2
  50.       opacity = 255
  51.     else
  52.       opacity = 100
  53.     end
  54.     # 这里的图标大小默认是24x24,要改就改下面那个Rect.new(0, 0, 24, 24)
  55.     self.contents.blt(296 + 13 * state_size ,36 + 89 ,bitmap, Rect.new(0, 0, 12, 12), opacity)
  56.     state_size += 1
  57.   end
  58. end
  59. end
  60.  
  61.  
  62. #==============================================================================
  63. # ■ Window_Help
  64. #------------------------------------------------------------------------------
  65. #  特技及物品的说明、角色的状态显示的窗口。
  66. #==============================================================================
  67.  
  68. class Window_Help < Window_Base
  69. #--------------------------------------------------------------------------
  70. # ● 设置敌人
  71. #     enemy : 要显示名字和状态的敌人
  72. #--------------------------------------------------------------------------
  73. def set_enemy(enemy)
  74.   # 描绘状态图标
  75.   state_size = 0
  76.   for state in enemy.states
  77.     # 图标数量超出宽度就中断循环
  78.     if state_size >= width / 16
  79.       break
  80.     end
  81.     # 此状态不带图标就跳过
  82.     if !ICON_STATE_IDS.include?(state)
  83.       next
  84.     end
  85.     bitmap = RPG::Cache.icon($data_states[state].name + "_sta.png")
  86.     if enemy.states_turn[state] >= $data_states[state].hold_turn/2
  87.       opacity = 255
  88.     else
  89.       opacity = 100
  90.     end
  91.     self.contents.blt(70 + 16 * state_size, 0, bitmap, Rect.new(0, 0, 24, 24), opacity)
  92.     state_size += 1
  93.   end
  94.   # 描绘敌人名字
  95.   set_text(enemy.name, 1)
  96. end
  97. end
  98.  
  99. class Game_Battler
  100. attr_reader :states_turn       # 声明状态剩余回合
  101. end

召唤高手...@弗雷德 @美丽晨露
还是您两位...
作者: 我爱吴悦淇    时间: 2013-4-22 18:19
把整个窗体发上来吧!
@弗雷德
第55行,看到没。。。
作者: 美丽晨露    时间: 2013-4-22 21:24
不好意思,我还真的不懂
作者: 芯☆淡茹水    时间: 2013-4-22 21:43
本帖最后由 芯☆淡茹水 于 2013-4-22 21:45 编辑

你改坐标可能改错地方了,
第 55 行:self.contents.blt(296 + 13 * state_size ,36 + 89 ,bitmap, Rect.new(0, 0, 12, 12), opacity)
那个 Rect.new(0, 0, 12, 12) 不是改坐标的,把它改回来:Rect.new(0, 0, 24, 24)
坐标是这两个: x =  296 + 13 * state_size
                      y =  36 + 89

(怎么没用传送过来的x,y?)
作者: 芯☆淡茹水    时间: 2013-4-22 22:01
觉得 Window_Base 里面的定义应该是这样:
  1. class Window_Base < Window
  2.   def draw_actor_state(actor, x, y, width = 120)
  3.   state_size = 0  
  4.   for state in actor.states   
  5.     # 图标数量超出宽度就中断循环   
  6.     if state_size >= width / 24 - 1 # 宽 120 ,用 24X24 图标的话,可同时显示 5 个。   
  7.       break   
  8.     end   
  9.     # 此状态不带图标就跳过   
  10.     if !ICON_STATE_IDS.include?(state)      
  11.       next   
  12.     end   
  13.     bitmap = RPG::Cache.icon($data_states[state].name + "_sta.png")   
  14.     if actor.states_turn[state] >= $data_states[state].hold_turn/2      
  15.       opacity = 255   
  16.     else      
  17.       opacity = 100   
  18.     end   
  19.      # 这里的图标大小默认是24x24,要改就改下面那个Rect.new(0, 0, 24, 24)   
  20.      self.contents.blt(x + 24 * state_size , y, bitmap, Rect.new(0, 0, 24, 24), opacity)   
  21.      state_size += 1  
  22.     end
  23.   end
  24. end
复制代码

作者: 紫英晓狼1130    时间: 2013-4-23 03:38
芯☆淡茹水 发表于 2013-4-22 22:01
觉得 Window_Base 里面的定义应该是这样:

那请问怎样改图标的坐标?
作者: 弗雷德    时间: 2013-4-23 10:14
不知道为啥你的脚本俺复制不了,
你全局搜索一下你使用过draw_actor_state这个方法的地方,然后把draw_actor_state这个方法里的坐标改一下。

这两天心情很差,所以昨天没心情看,不好意思。
作者: 弗雷德    时间: 2013-4-23 16:19


晓狼是要这个效果么?
问题出在48行附近
  1. # 这里的图标大小默认是24x24,要改就改下面那个Rect.new(0, 0, 24, 24)
  2. self.contents.blt(x + 12 * state_size , y , bitmap, Rect.new(0, 0, 12, 12), opacity)
复制代码
这里X的间隔以及描绘的区域都是12,所以只能画出一半,你把12都改成24就成了。横轴X的间隔你自己看着弄吧。
  1. # 这里的图标大小默认是24x24,要改就改下面那个Rect.new(0, 0, 24, 24)
  2. self.contents.blt(x + 24 * state_size , y , bitmap, Rect.new(0, 0, 24, 24), opacity)
复制代码

作者: 亿万星辰    时间: 2013-4-23 16:56
55行这里有问题
    self.contents.blt(296 + 13 * state_size ,36 + 89 ,bitmap, Rect.new(0, 0, 12, 12), opacity)
应该是坐标以角色的x和y来做一个整体的移动
      self.contents.blt(x + 24 * state_size ,y ,bitmap, Rect.new(0, 0, 24, 24), opacity)

作者: 芯☆淡茹水    时间: 2013-4-23 18:50
本帖最后由 芯☆淡茹水 于 2013-4-23 18:51 编辑
亿万星辰 发表于 2013-4-23 16:56
55行这里有问题
    self.contents.blt(296 + 13 * state_size ,36 + 89 ,bitmap, Rect.new(0, 0, 12, 12), ...


话说都看见啦,

还有个地方有问题:


if state_size >= width / 1     
   break   
end

照上面的话可同时显示 120 个图标~~~
所以觉得应该是这样:

if state_size >= width / 24 - 1
    break   
end

建议LZ把完整脚本发上来,方便查看和更改




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