Project1

标题: 脚本中Game_Actor的一个问题 [打印本页]

作者: tree52    时间: 2009-8-9 15:15
标题: 脚本中Game_Actor的一个问题
本帖最后由 tree52 于 2009-8-10 15:42 编辑

2楼紫苏已经帮忙完成了战斗中人物站位的问题,随之而来的是人物血条不对应,恳请大侠们帮忙看下是哪个地方的数据要更改,血条脚本参见7楼,再次致谢!

以下是2-8楼解决的问题:
=============================================
我在做45度战斗中遇到人物站位的一个问题。按照如下脚本设置的话,那么如果队伍中有一个人,那么这个人就在一个角落的那里,两个人的话就挨着第一个人,总之不能达到一个人也罢、两个人也罢、三个四个人也在居中于斜对角线那里的效果。以图示说明下面的脚本:
队伍中只有一个人(不管是谁):
两人:
三人: 四人:
脚本如下:
  1. #--------------------------------------------------------------------------
  2.   # ● 取得战斗画面的 X 坐标
  3.   #--------------------------------------------------------------------------
  4.   def screen_x
  5.     # 返回计算后的队伍 X 坐标的排列顺序
  6.     if self.index != nil
  7.       case self.index
  8.       when 0
  9.         return 340
  10.       when 1
  11.         return 380
  12.       when 2
  13.         return 440
  14.       when 3
  15.         return 500
  16.       end
  17.     else
  18.       return 0
  19.     end
  20.   end
  21. #--------------------------------------------------------------------------
  22.   # ● 取得战斗画面的 Y 坐标
  23.   #--------------------------------------------------------------------------
  24.   def screen_y
  25.     case self.index
  26.     when 0
  27.       return 420
  28.     when 1
  29.       return 360
  30.     when 2
  31.       return 300
  32.     when 3
  33.       return 240
  34.     end
  35.   end
复制代码
现在不希望这种效果,人物都站偏了,能否有个脚本可以达到不管几个人,都能在居中于斜对角线那里的效果呢?如图:
一人: 两人:
三人: 然后是四人:
================================================
以上问题2-8楼以解决,请大家帮我解决最上面提出的问题。十分感谢。
完成后定会一同结贴与认可。
作者: 紫苏    时间: 2009-8-9 15:52
  1.   #--------------------------------------------------------------------------
  2.   # ● 取得战斗画面的 X 坐标
  3.   #--------------------------------------------------------------------------
  4.   def screen_x
  5.     # 返回计算后的队伍 X 坐标的排列顺序
  6.     return (if self.index != nil
  7.       (case self.index
  8.       when 0
  9.         340
  10.       when 1
  11.         380
  12.       when 2
  13.         440
  14.       when 3
  15.         500
  16.       end) + 32 * (4 - $game_party.actors.size)
  17.     else
  18.       0
  19.     end)
  20.   end
  21. #--------------------------------------------------------------------------
  22.   # ● 取得战斗画面的 Y 坐标
  23.   #--------------------------------------------------------------------------
  24.   def screen_y
  25.     return (case self.index
  26.     when 0
  27.       420
  28.     when 1
  29.       360
  30.     when 2
  31.       300
  32.     when 3
  33.       240
  34.     end) - 32 * (4 - $game_party.actors.size)
  35.   end
复制代码
32 * (4 - $game_party.actors.size) 这里是关键,可以自行调节~
作者: 后知后觉    时间: 2009-8-9 16:01
本帖最后由 后知后觉 于 2009-8-9 16:05 编辑

玩过梦幻西游没?

1号位置放中间
2号位置放1号位置的右边
3号位置放1号位置的左边
4号位置放2号位置的右边
5号位置放3号位置的左边

        4
      2
    1
  3
5
作者: tree52    时间: 2009-8-9 16:38
本帖最后由 tree52 于 2009-8-9 16:43 编辑

2# 紫苏

十分感谢 紫苏 !学习了……嗯
玩过梦幻西游没?


        4
      2
    1
  3
5 ...
后知后觉 发表于 2009-8-9 16:01

也谢谢 后知后觉,原来也可以这样子的~~嘿嘿

还有个问题哈…那个血条怎么处理呢?
作者: 传说中di    时间: 2009-8-9 17:20
  #--------------------------------------------------------------------------
  # ● 取得战斗画面的 X 坐标
  #--------------------------------------------------------------------------
  def screen_x
...
紫苏 发表于 2009-8-9 15:52

要改的地方还有血条的位置...
作者: 紫苏    时间: 2009-8-9 19:39
麻烦你把血条的脚本贴出来
作者: tree52    时间: 2009-8-9 20:31
本帖最后由 tree52 于 2009-8-9 20:40 编辑

6# 紫苏
以下是血条的脚本,我不是特别理解,放上去血条不能在人物正下方对齐,麻烦再看下吧,谢谢o(∩_∩)o...
  1. #==============================================================================
  2. # ■ Window_Base
  3. #------------------------------------------------------------------------------
  4. #  游戏中全部窗口的超级类。
  5. #==============================================================================

  6. class Window_Base < Window
  7. #--------------------------------------------------------------------------
  8. # ● 描绘 HP
  9. #     actor : 角色
  10. #     x     : 描画目标 X 坐标
  11. #     y     : 描画目标 Y 坐标
  12. #     width : 描画目标的宽
  13. #--------------------------------------------------------------------------
  14. def draw_actor_hp1(actor, x, y, width = 72)
  15.    # 描绘字符串 "HP"
  16.    self.contents.font.color = system_color
  17.    self.contents.draw_text(x, y, 24, 24, $data_system.words.hp)
  18.    # 计算描绘 MaxHP 所需的空间
  19.    if width - 24 >= 32
  20.      hp_x = x + 32# + width - 24
  21.    end
  22.    # 描绘 HP
  23.    self.contents.font.color = actor.hp == 0 ? knockout_color :
  24.      actor.hp <= actor.maxhp / 4 ? crisis_color : normal_color
  25.    self.contents.draw_text(hp_x, y, 32, 24, actor.hp.to_s, 2)
  26. end
  27. #--------------------------------------------------------------------------
  28. # ● 描绘 SP
  29. #     actor : 角色
  30. #     x     : 描画目标 X 坐标
  31. #     y     : 描画目标 Y 坐标
  32. #     width : 描画目标的宽
  33. #--------------------------------------------------------------------------
  34. def draw_actor_sp1(actor, x, y, width = 72)
  35.    # 描绘字符串 "SP"
  36.    self.contents.font.color = system_color
  37.    self.contents.draw_text(x, y, 24, 24, $data_system.words.sp)
  38.    # 计算描绘 MaxSP 所需的空间
  39.    if width - 24 >= 32
  40.      sp_x = x + 32# + width - 24
  41.    end
  42.    # 描绘 SP
  43.    self.contents.font.color = actor.sp == 0 ? knockout_color :
  44.      actor.sp <= actor.maxsp / 4 ? crisis_color : normal_color
  45.    self.contents.draw_text(sp_x, y, 32, 24, actor.sp.to_s, 2)
  46. end
  47. end





  48. #==============================================================================
  49. # ■ Window_BattleStatus
  50. #------------------------------------------------------------------------------
  51. #  显示战斗画面同伴状态的窗口。
  52. #==============================================================================

  53. class Window_BattleStatus < Window_Base
  54. #--------------------------------------------------------------------------
  55. # ● 初始化对像
  56. #--------------------------------------------------------------------------
  57. #$data_system_level_up_me = "Audio/ME/升级音乐"
  58. def initialize
  59.    super(0, 0, 640, 480)
  60.    self.contents = Bitmap.new(width - 10, height - 32)
  61.    self.opacity = 0
  62.    @level_up_flags = [false, false, false, false]
  63.    refresh
  64. end
  65. #--------------------------------------------------------------------------
  66. # ● 释放
  67. #--------------------------------------------------------------------------
  68. def dispose
  69.    super
  70. end
  71. #--------------------------------------------------------------------------
  72. # ● 设置升级标志
  73. #     actor_index : 角色索引
  74. #--------------------------------------------------------------------------
  75. def level_up(actor_index)
  76.    @level_up_flags[actor_index] = true
  77. end
  78. #--------------------------------------------------------------------------
  79. # ● 刷新
  80. #--------------------------------------------------------------------------
  81. def refresh
  82.    self.contents.clear
  83.    @item_max = $game_party.actors.size
  84.     for i in 0...$game_party.actors.size
  85.      actor = $game_party.actors[i]
  86.      case i
  87.        when 0
  88.         x = 310
  89.         y = 390
  90.        when 1
  91.         x = 390
  92.         y = 340
  93.        when 2
  94.         x = 480
  95.         y = 300
  96.        when 3
  97.         x = 550
  98.         y = 270
  99.       end
  100.      if @level_up_flags[i]
  101.        self.contents.font.color = normal_color
  102.        self.contents.draw_text(x, y, 80, 24, "LEVEL UP!")
  103.        Audio.me_stop
  104. #        Audio.me_play($data_system_level_up_me)
  105.      else
  106.      draw_actor_hp1(actor, x-15, y-15, 80)
  107.      draw_actor_sp1(actor, x-15, y+5, 80)
  108.     end
  109.    end
  110. end

  111. #--------------------------------------------------------------------------
  112.   # ● 刷新画面
  113.   #--------------------------------------------------------------------------
  114.   def update
  115.     super
  116.     # 主界面的不透明度下降
  117.     if $game_temp.battle_main_phase
  118.       self.contents_opacity -= 4 if self.contents_opacity > 191
  119.     else
  120.       self.contents_opacity += 4 if self.contents_opacity < 255
  121.     end
  122.   end
  123. end





  124. #==============================================================================
  125. # ■ Window_BattleStatus
  126. #==============================================================================
  127. class Window_BattleStatus < Window_Base
  128. #--------------------------------------------------------------------------
  129. # ● 初始化
  130. #--------------------------------------------------------------------------
  131. alias xrxs_bp2_refresh refresh
  132. def refresh
  133.    xrxs_bp2_refresh
  134.    @item_max = $game_party.actors.size
  135.     for i in 0...$game_party.actors.size
  136.      actor = $game_party.actors[i]
  137.      case i
  138.        when 0
  139.         x = 310
  140.         y = 390
  141.        when 1
  142.         x = 390
  143.         y = 340
  144.        when 2
  145.         x = 480
  146.         y = 300
  147.        when 3
  148.         x = 550
  149.         y = 270
  150.       end
  151.      draw_actor_hp_meter(actor, x, y, 50)
  152.      draw_actor_sp_meter(actor, x, y + 8, 50)
  153.    end
  154. end
  155. end

  156. #==============================================================================
  157. # ■ Window_Base
  158. #==============================================================================
  159. class Window_Base < Window
  160. #--------------------------------------------------------------------------
  161. # ● HP描画
  162. #--------------------------------------------------------------------------
  163. def draw_actor_hp_meter(actor, x, y, width = 156, type = 0)
  164.    if type == 1 and actor.hp == 0
  165.      return
  166.    end
  167.    self.contents.font.color = system_color
  168.    self.contents.fill_rect(x-1, y+27, width+2,6, Color.new(0, 0, 0, 25))
  169.    w = width * actor.hp / actor.maxhp
  170.    self.contents.fill_rect(x, y+28, w,1, Color.new(255, 96, 96, 255))
  171.    self.contents.fill_rect(x, y+29, w,1, Color.new(255, 0, 0, 255))
  172.    self.contents.fill_rect(x, y+30, w,1, Color.new(128, 0, 0, 255))
  173.    self.contents.fill_rect(x, y+31, w,1, Color.new(0, 0, 0, 255))
  174.    
  175.    end
  176. #--------------------------------------------------------------------------
  177. # ● SP描画
  178. #--------------------------------------------------------------------------
  179. def draw_actor_sp_meter(actor, x, y, width = 156, type = 0)
  180.    if type == 1 and actor.hp == 0
  181.      return
  182.    end
  183.    self.contents.font.color = system_color
  184.    self.contents.fill_rect(x-1, y+27, width+2,6, Color.new(0, 0, 0, 255))
  185.    w = width * actor.sp / actor.maxsp
  186.    self.contents.fill_rect(x, y+28, w,1, Color.new(128, 255, 255, 255))
  187.    self.contents.fill_rect(x, y+29, w,1, Color.new(0, 255, 255, 255))
  188.    self.contents.fill_rect(x, y+30, w,1, Color.new(0, 192, 192, 255))
  189.    self.contents.fill_rect(x, y+31, w,1, Color.new(0, 128, 128, 255))
  190. end
  191. end
复制代码

作者: azuredam    时间: 2009-8-9 21:00
提示: 作者被禁止或删除 内容自动屏蔽
作者: tree52    时间: 2009-8-10 15:42
那现在人物与血条不对应了怎么办?
作者: tree52    时间: 2009-8-10 20:27
超过三个小时自顶一次。

重新描述下问题:按照紫苏中32 * (4 - $game_party.actors.size) 这个关键的一步,怎么才能把血条放在人物下方?由于这个方法中人物位置是不固定的,所以如果获取了人物坐标会不会产生不是对应在某一主角下面…?如不能求解,我也就放弃继续询问了,谢谢…
作者: 紫苏    时间: 2009-8-10 20:47
其实楼上几位提到的分歧法效率是最高的,但是那样写的话代码会变得比较冗长,n*(4-$game_party.actors.size) 的话就比较简洁~

你找到血条脚本中的两段 case...end,在后面对 x 和 y 做相同的加减运算:
x += 32 * (4 - $game_party.actors.size)
y -= 32 * (4 - $game_party.actors.size)
即可~
作者: tree52    时间: 2009-8-10 22:12
11# 紫苏


谢谢紫苏,处理好咯。献上处理好的HP、MP脚本:
  1. # 感谢 传说中di 提供脚本,感谢 紫苏 修改脚本
  2. #==============================================================================
  3. # ■ Window_Base
  4. #------------------------------------------------------------------------------
  5. #  游戏中全部窗口的超级类。
  6. #==============================================================================

  7. class Window_Base < Window
  8. #--------------------------------------------------------------------------
  9. # ● 描绘 HP
  10. #     actor : 角色
  11. #     x     : 描画目标 X 坐标
  12. #     y     : 描画目标 Y 坐标
  13. #     width : 描画目标的宽
  14. #--------------------------------------------------------------------------
  15. def draw_actor_hp1(actor, x, y, width = 72)
  16.    # 描绘字符串 "HP"
  17.    self.contents.font.color = system_color
  18.    self.contents.draw_text(x, y, 24, 24, $data_system.words.hp)
  19.    # 计算描绘 MaxHP 所需的空间
  20.    if width - 24 >= 32
  21.      hp_x = x + 32# + width - 24
  22.    end
  23.    # 描绘 HP
  24.    self.contents.font.color = actor.hp == 0 ? knockout_color :
  25.      actor.hp <= actor.maxhp / 4 ? crisis_color : normal_color
  26.    self.contents.draw_text(hp_x, y, 32, 24, actor.hp.to_s, 2)
  27. end
  28. #--------------------------------------------------------------------------
  29. # ● 描绘 SP
  30. #     actor : 角色
  31. #     x     : 描画目标 X 坐标
  32. #     y     : 描画目标 Y 坐标
  33. #     width : 描画目标的宽
  34. #--------------------------------------------------------------------------
  35. def draw_actor_sp1(actor, x, y, width = 72)
  36.    # 描绘字符串 "SP"
  37.    self.contents.font.color = system_color
  38.    self.contents.draw_text(x, y, 24, 24, $data_system.words.sp)
  39.    # 计算描绘 MaxSP 所需的空间
  40.    if width - 24 >= 32
  41.      sp_x = x + 32# + width - 24
  42.    end
  43.    # 描绘 SP
  44.    self.contents.font.color = actor.sp == 0 ? knockout_color :
  45.      actor.sp <= actor.maxsp / 4 ? crisis_color : normal_color
  46.    self.contents.draw_text(sp_x, y, 32, 24, actor.sp.to_s, 2)
  47. end
  48. end





  49. #==============================================================================
  50. # ■ Window_BattleStatus
  51. #------------------------------------------------------------------------------
  52. #  显示战斗画面同伴状态的窗口。
  53. #==============================================================================

  54. class Window_BattleStatus < Window_Base
  55. #--------------------------------------------------------------------------
  56. # ● 初始化对像
  57. #--------------------------------------------------------------------------
  58. #$data_system_level_up_me = "Audio/ME/升级音乐"
  59. def initialize
  60.    super(0, 0, 640, 480)
  61.    self.contents = Bitmap.new(width - 10, height - 32)
  62.    self.opacity = 0
  63.    @level_up_flags = [false, false, false, false]
  64.    refresh
  65. end
  66. #--------------------------------------------------------------------------
  67. # ● 释放
  68. #--------------------------------------------------------------------------
  69. def dispose
  70.    super
  71. end
  72. #--------------------------------------------------------------------------
  73. # ● 设置升级标志
  74. #     actor_index : 角色索引
  75. #--------------------------------------------------------------------------
  76. def level_up(actor_index)
  77.    @level_up_flags[actor_index] = true
  78. end
  79. #--------------------------------------------------------------------------
  80. # ● 刷新
  81. #--------------------------------------------------------------------------
  82. def refresh
  83.    self.contents.clear
  84.    @item_max = $game_party.actors.size
  85.     for i in 0...$game_party.actors.size
  86.      actor = $game_party.actors[i]
  87.      case i
  88.        when 0
  89.         x = 310
  90.         y = 390
  91.        when 1
  92.         x = 390
  93.         y = 340
  94.        when 2
  95.         x = 480
  96.         y = 300
  97.        when 3
  98.         x = 550
  99.         y = 270
  100.       end
  101.       x+= 32 * (4 - $game_party.actors.size)
  102.       y-= 32 * (4 - $game_party.actors.size)
  103.       
  104.      if @level_up_flags[i]
  105.        self.contents.font.color = normal_color
  106.        self.contents.draw_text(x, y, 80, 24, "LEVEL UP!")
  107.        Audio.me_stop
  108. #        Audio.me_play($data_system_level_up_me)
  109.      else
  110.      draw_actor_hp1(actor, x-15, y-15, 80)
  111.      draw_actor_sp1(actor, x-15, y+5, 80)
  112.     end
  113.    end
  114. end

  115. #--------------------------------------------------------------------------
  116.   # ● 刷新画面
  117.   #--------------------------------------------------------------------------
  118.   def update
  119.     super
  120.     # 主界面的不透明度下降
  121.     if $game_temp.battle_main_phase
  122.       self.contents_opacity -= 4 if self.contents_opacity > 191
  123.     else
  124.       self.contents_opacity += 4 if self.contents_opacity < 255
  125.     end
  126.   end
  127. end





  128. #==============================================================================
  129. # ■ Window_BattleStatus
  130. #==============================================================================
  131. class Window_BattleStatus < Window_Base
  132. #--------------------------------------------------------------------------
  133. # ● 初始化
  134. #--------------------------------------------------------------------------
  135. alias xrxs_bp2_refresh refresh
  136. def refresh
  137.    xrxs_bp2_refresh
  138.    @item_max = $game_party.actors.size
  139.     for i in 0...$game_party.actors.size
  140.      actor = $game_party.actors[i]
  141.      case i
  142.        when 0
  143.         x = 310
  144.         y = 390
  145.        when 1
  146.         x = 390
  147.         y = 340
  148.        when 2
  149.         x = 480
  150.         y = 300
  151.        when 3
  152.         x = 550
  153.         y = 270
  154.       end
  155.       x+= 32 * (4 - $game_party.actors.size)
  156.       y-= 32 * (4 - $game_party.actors.size)
  157.       
  158.      draw_actor_hp_meter(actor, x, y, 50)
  159.      draw_actor_sp_meter(actor, x, y + 8, 50)
  160.    end
  161. end
  162. end
  163. #==============================================================================
  164. # ■ Window_Base
  165. #==============================================================================
  166. class Window_Base < Window
  167. #--------------------------------------------------------------------------
  168. # ● HP描画
  169. #--------------------------------------------------------------------------
  170. def draw_actor_hp_meter(actor, x, y, width = 156, type = 0)
  171.    if type == 1 and actor.hp == 0
  172.      return
  173.    end
  174.    self.contents.font.color = system_color
  175.    self.contents.fill_rect(x-1, y+27, width+2,6, Color.new(0, 0, 0, 25))
  176.    w = width * actor.hp / actor.maxhp
  177.    self.contents.fill_rect(x, y+28, w,1, Color.new(255, 96, 96, 255))
  178.    self.contents.fill_rect(x, y+29, w,1, Color.new(255, 0, 0, 255))
  179.    self.contents.fill_rect(x, y+30, w,1, Color.new(128, 0, 0, 255))
  180.    self.contents.fill_rect(x, y+31, w,1, Color.new(0, 0, 0, 255))
  181.    
  182.    end
  183. #--------------------------------------------------------------------------
  184. # ● SP描画
  185. #--------------------------------------------------------------------------
  186. def draw_actor_sp_meter(actor, x, y, width = 156, type = 0)
  187.    if type == 1 and actor.hp == 0
  188.      return
  189.    end
  190.    self.contents.font.color = system_color
  191.    self.contents.fill_rect(x-1, y+27, width+2,6, Color.new(0, 0, 0, 255))
  192.    w = width * actor.sp / actor.maxsp
  193.    self.contents.fill_rect(x, y+28, w,1, Color.new(128, 255, 255, 255))
  194.    self.contents.fill_rect(x, y+29, w,1, Color.new(0, 255, 255, 255))
  195.    self.contents.fill_rect(x, y+30, w,1, Color.new(0, 192, 192, 255))
  196.    self.contents.fill_rect(x, y+31, w,1, Color.new(0, 128, 128, 255))
  197. end
  198. end
复制代码
附带一张效果图:


再次感谢你们的解答,我结贴咯……




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