Project1

标题: 求大神写个脚本 在地图上显示HP 和MP [打印本页]

作者: barrysandy    时间: 2016-1-1 21:27
标题: 求大神写个脚本 在地图上显示HP 和MP
   类似于勇者斗恶龙 多个角色显示多条  跪求
作者: barrysandy    时间: 2016-1-1 21:27
范例图片
作者: 505681468    时间: 2016-1-6 22:42
本帖最后由 505681468 于 2016-1-9 11:06 编辑

[ 本帖最后由 505681468 于 2016-1-9 11:04 编辑 ]\n\n试试这个看看?不知道还有什么bug和卡顿情况...

RUBY 代码复制
  1. class Window_SimpleStatus < Window_Base
  2.   #--------------------------------------------------------------------------
  3.   # ● initialize 外窗口初始化
  4.   #          变量 :@old_party_data 保存上一刻的队伍(所有队友?)信息
  5.   #                 @inside_windows 保存信息显示窗口
  6.   #                 @outside_windows_changed 第一次创建外窗口 或
  7.   #                                          外窗口需要更新的标示
  8.   #--------------------------------------------------------------------------
  9.   def initialize
  10.     @x = 0
  11.     @y = Graphics.height - line_height*($game_party.all_members.size-1) - 48
  12.     width = Graphics.width
  13.     height = 48 +  line_height*($game_party.all_members.size-1)
  14.     super(@x, @y, width, height)
  15.  
  16.     @old_party_data = []
  17.     @inside_windows = []
  18.     old_party_data_initialize
  19.     inside_windows_initialize
  20.     @outside_windows_changed = true
  21.   end
  22.   #--------------------------------------------------------------------------
  23.   # ● old_party_data 数组初始化
  24.   #    @old_party_data :保存上一刻的队伍(所有队友?)信息,包括:
  25.   #                      name  姓名
  26.   #                      level 等级
  27.   #                      hp    生命值
  28.   #                      mhp   最大生命值
  29.   #                      mp    魔法值
  30.   #                      mmp   最大魔法值
  31.   #--------------------------------------------------------------------------
  32.   def old_party_data_initialize
  33.     for i in 0..$game_party.all_members.size-1
  34.       actor = $game_party.all_members[i]
  35.       @old_party_data.push([actor.name, actor.level, actor.hp, actor.mhp, actor.mp, actor.mmp])
  36.     end
  37.   end
  38.   #--------------------------------------------------------------------------
  39.   # ● inside_windows 数组初始化
  40.   #    @inside_windows :显示角色信息的窗口(边框透明度为 0 的窗口)
  41.   #               变量 :height  窗口高度
  42.   #                      width   窗口宽度
  43.   #                      x       窗口左上角 x 坐标
  44.   #                      y       窗口左上角 y 坐标
  45.   #--------------------------------------------------------------------------
  46.   def inside_windows_initialize
  47.     for i in 0..$game_party.all_members.size-1
  48.       height = 96 if height != 96
  49.       width = Graphics.width/4+48
  50.       @inside_windows.push(Array.new([Window_Base.new(0,0,width-24,height),Window_Base.new(0,0,width,height),Window_Base.new(0,0,width,height),Window_Base.new(0,0,width,height)]))
  51.     end
  52.     for i in 0..$game_party.all_members.size-1
  53.       @inside_windows[i].each do |window|
  54.         window.opacity = 0
  55.         window.back_opacity = 0
  56.         window.contents_opacity = 0
  57.         window.padding = 0
  58.       end
  59.     end
  60.     for i in 0..@inside_windows.size-1
  61.       actor = $game_party.all_members
  62.       x = y = standard_padding
  63.       width = Graphics.width/4
  64.       @inside_windows[i][0].draw_actor_name(actor[i], x, y, width)
  65.       @inside_windows[i][1].draw_actor_level(actor[i], x, y)
  66.       @inside_windows[i][2].draw_actor_hp(actor[i], x, y, width)
  67.       @inside_windows[i][3].draw_actor_mp(actor[i], x, y, width)
  68.     end
  69.   end
  70.   #--------------------------------------------------------------------------
  71.   # ● update : 更新
  72.   #--------------------------------------------------------------------------
  73.   def update
  74.     super
  75.     outside_windows_update
  76.     inside_windows_update
  77.     old_party_data_update
  78.   end
  79.   #--------------------------------------------------------------------------
  80.   # ● outside_windows_update : 外窗口更新(就是那个边框)
  81.   #    @inside_windows :显示角色信息的窗口
  82.   #               变量 :height  窗口高度
  83.   #                      width   窗口宽度
  84.   #                      @x      外窗口左上角 x 坐标
  85.   #                      @y      外窗口左上角 y 坐标
  86.   #--------------------------------------------------------------------------
  87.   def outside_windows_update
  88.     return if @outside_windows_changed == false
  89.     for i in 0..@inside_windows.size-1
  90.       x = @x
  91.       y = @y
  92.       height = i
  93.       width = Graphics.width/4
  94.       padding = i==0?0:24
  95.       @inside_windows[i][0].move(x+width*0, y+line_height*height, width, line_height+standard_padding*4)
  96.       @inside_windows[i][1].move(x+width*1-12, y+line_height*height, width+24, line_height+standard_padding*4)
  97.       @inside_windows[i][2].move(x+width*2-36, y+line_height*height, width+24, line_height+standard_padding*4)
  98.       @inside_windows[i][3].move(x+width*3-24, y+line_height*height, width+24, line_height+standard_padding*4)
  99.     end
  100.     @outside_windows_changed = false
  101.   end
  102.   #--------------------------------------------------------------------------
  103.   # ● inside_windows_update : 内窗口更新,仅当窗口内容发生变化时更新
  104.   #--------------------------------------------------------------------------
  105.   def inside_windows_update
  106.     for i in 0..@inside_windows.size-1
  107.       actor = $game_party.all_members
  108.       x = y = standard_padding
  109.       width = Graphics.width/4
  110.       if name_change(i,actor[i])
  111.         @inside_windows[i][0].contents.clear
  112.         @inside_windows[i][0].draw_actor_name(actor[i], x, y, width)
  113.       end
  114.       if level_change(i,actor[i])
  115.         @inside_windows[i][1].contents.clear
  116.         @inside_windows[i][1].draw_actor_level(actor[i], x, y)
  117.       end
  118.       if hp_change(i,actor[i])
  119.         @inside_windows[i][2].contents.clear
  120.         @inside_windows[i][2].draw_actor_hp(actor[i], x, y, width)
  121.       end
  122.       if mp_change(i,actor[i])
  123.         @inside_windows[i][3].contents.clear
  124.         @inside_windows[i][3].draw_actor_mp(actor[i], x, y, width)
  125.       end
  126.       @inside_windows.each do |window|
  127.         window.each do |obj|
  128.           obj.contents_opacity = 255
  129.         end
  130.       end
  131.     end
  132.   end
  133.   #--------------------------------------------------------------------------
  134.   # ● old_party_data_update : @old_party_data更新,仅当所有窗口更新完毕后更新
  135.   #--------------------------------------------------------------------------
  136.   def old_party_data_update
  137.     for i in 0..@old_party_data.size-1
  138.       actor = $game_party.all_members[i]
  139.       @old_party_data[i][0] = actor.name if name_change(i,actor)
  140.       @old_party_data[i][1] = actor.level if level_change(i,actor)
  141.       @old_party_data[i][2] = actor.hp if hp_change(i,actor)
  142.       @old_party_data[i][3] = actor.mp if mp_change(i,actor)
  143.     end
  144.   end
  145.   #--------------------------------------------------------------------------
  146.   # ● *_change : 检查需要显示的队伍数据是否发生变化
  147.   #--------------------------------------------------------------------------
  148.   def name_change(index = 0,actor)
  149.     return @old_party_data[index][0]!=actor.name
  150.   end
  151.  
  152.   def level_change(index = 0,actor)
  153.     return @old_party_data[index][1]!=actor.level
  154.   end
  155.  
  156.   def hp_change(index = 0,actor)
  157.     return @old_party_data[index][2]!=actor.hp || @old_party_data[index][3]!=actor.mhp
  158.   end
  159.  
  160.   def mp_change(index = 0,actor)
  161.     return @old_party_data[index][4]!=actor.mp || @old_party_data[index][5]!=actor.mmp
  162.   end
  163.   #--------------------------------------------------------------------------
  164.   # ● old_party_data
  165.   #--------------------------------------------------------------------------
  166.   def old_party_data
  167.     @old_party_data
  168.   end
  169.   #--------------------------------------------------------------------------
  170.   # ● need_dispose :检查是否需要销毁窗口,在必要时(卡顿等)返回撤销命令
  171.   #--------------------------------------------------------------------------
  172.   def need_dispose
  173.     return true if @old_party_data.size != $game_party.all_members.size
  174.     actor = $game_party.all_members
  175.     for i in 0..@old_party_data.size-1
  176.       return true if @old_party_data[i][0] != actor[i].name
  177.       return true if @old_party_data[i][1] != actor[i].level
  178.       return true if @old_party_data[i][3] != actor[i].mhp
  179.       return true if @old_party_data[i][5] != actor[i].mmp
  180.     end
  181.     return false
  182.   end
  183.   #--------------------------------------------------------------------------
  184.   # ● dispose :销毁窗口
  185.   #--------------------------------------------------------------------------
  186.   def dispose
  187.     super
  188.     @inside_windows.each do |window|
  189.       window.each do |obj|
  190.         obj.dispose
  191.       end
  192.     end
  193.   end
  194. end
  195.  
  196. class Scene_Map
  197.   alias old_start start
  198.   def start
  199.     old_start
  200.     @Window_SimpleStatus = Window_SimpleStatus.new
  201.   end
  202.  
  203.   alias old_pre_terminate pre_terminate
  204.   def pre_terminate
  205.     old_pre_terminate
  206.     @Window_SimpleStatus.dispose
  207.   end
  208.  
  209.   alias old_update update
  210.   def update
  211.     old_update
  212.     if @Window_SimpleStatus.need_dispose
  213.       @Window_SimpleStatus.dispose
  214.       @Window_SimpleStatus = Window_SimpleStatus.new
  215.     end
  216.   end
  217. end

temp.PNG (113.91 KB, 下载次数: 33)

附图

附图

作者: Vortur    时间: 2016-1-8 23:29
本帖最后由 Vortur 于 2016-1-8 23:31 编辑

可以尝试使用喵呜的“地图显示变量”,缺点是没有脸图和血条,只能显示数值。
也可以使用ABS和XBS系统,这两个功能做得很棒,缺点是设置很复杂。
还有一种是自己直接编写脚本,在下看楼上的就很好。
{:2_276:}不知帮到你没有
作者: barrysandy    时间: 2016-1-9 04:13
505681468 发表于 2016-1-6 22:42
试试这个看看?不知道还有什么bug和卡顿情况...

class Window_SimpleStatus < Window_Base

不过我用上脚本一直报错,不知道是怎么回事  图片
作者: barrysandy    时间: 2016-1-9 12:04
505681468 发表于 2016-1-6 22:42
[ 本帖最后由 505681468 于 2016-1-9 11:04 编辑 ]\n\n试试这个看看?不知道还有什么bug和卡顿情况 ...

多谢了,你们会脚本的真是厉害呀
作者: JJ999999999    时间: 2016-1-29 11:38
矮油~多谢啦。
作者: tcyz    时间: 2016-1-29 12:37
谢谢{:2_274:}




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