查看: 2025|回复: 7

[已经解决] 求大神写个脚本 在地图上显示HP 和MP

[复制链接]
梦石
0
星屑
62
在线时间
44 小时
注册时间
2015-5-11
回帖
23
发表于 2016-1-1 21:27:00 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有账号?注册会员

×
   类似于勇者斗恶龙 多个角色显示多条  跪求
梦石
0
星屑
62
在线时间
44 小时
注册时间
2015-5-11
回帖
23
 楼主| 发表于 2016-1-1 21:27:35 | 显示全部楼层
回复

使用道具 举报

梦石
0
星屑
1333
在线时间
471 小时
注册时间
2012-4-8
回帖
314
发表于 2016-1-6 22:42:17 | 显示全部楼层
本帖最后由 505681468 于 2016-1-9 11:06 编辑

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

[pre lang="ruby"]class Window_SimpleStatus < Window_Base
  #--------------------------------------------------------------------------
  # ● initialize 外窗口初始化
  #          变量 :@old_party_data 保存上一刻的队伍(所有队友?)信息
  #                 @inside_windows 保存信息显示窗口
  #                 @outside_windows_changed 第一次创建外窗口 或
  #                                          外窗口需要更新的标示
  #--------------------------------------------------------------------------
  def initialize
    @x = 0
    @y = Graphics.height - line_height*($game_party.all_members.size-1) - 48
    width = Graphics.width
    height = 48 +  line_height*($game_party.all_members.size-1)
    super(@x, @y, width, height)
   
    @old_party_data = []
    @inside_windows = []
    old_party_data_initialize
    inside_windows_initialize
    @outside_windows_changed = true
  end
  #--------------------------------------------------------------------------
  # ● old_party_data 数组初始化
  #    @old_party_data :保存上一刻的队伍(所有队友?)信息,包括:
  #                      name  姓名
  #                      level 等级
  #                      hp    生命值
  #                      mhp   最大生命值
  #                      mp    魔法值
  #                      mmp   最大魔法值
  #--------------------------------------------------------------------------
  def old_party_data_initialize
    for i in 0..$game_party.all_members.size-1
      actor = $game_party.all_members
      @old_party_data.push([actor.name, actor.level, actor.hp, actor.mhp, actor.mp, actor.mmp])
    end
  end
  #--------------------------------------------------------------------------
  # ● inside_windows 数组初始化
  #    @inside_windows :显示角色信息的窗口(边框透明度为 0 的窗口)
  #               变量 :height  窗口高度
  #                      width   窗口宽度
  #                      x       窗口左上角 x 坐标
  #                      y       窗口左上角 y 坐标
  #--------------------------------------------------------------------------
  def inside_windows_initialize
    for i in 0..$game_party.all_members.size-1
      height = 96 if height != 96
      width = Graphics.width/4+48
      @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)]))
    end
    for i in 0..$game_party.all_members.size-1
      @inside_windows.each do |window|
        window.opacity = 0
        window.back_opacity = 0
        window.contents_opacity = 0
        window.padding = 0
      end
    end
    for i in 0..@inside_windows.size-1
      actor = $game_party.all_members
      x = y = standard_padding
      width = Graphics.width/4
      @inside_windows[0].draw_actor_name(actor, x, y, width)
      @inside_windows[1].draw_actor_level(actor, x, y)
      @inside_windows[2].draw_actor_hp(actor, x, y, width)
      @inside_windows[3].draw_actor_mp(actor, x, y, width)
    end
  end
  #--------------------------------------------------------------------------
  # ● update : 更新
  #--------------------------------------------------------------------------
  def update
    super
    outside_windows_update
    inside_windows_update
    old_party_data_update
  end
  #--------------------------------------------------------------------------
  # ● outside_windows_update : 外窗口更新(就是那个边框)
  #    @inside_windows :显示角色信息的窗口
  #               变量 :height  窗口高度
  #                      width   窗口宽度
  #                      @x      外窗口左上角 x 坐标
  #                      @y      外窗口左上角 y 坐标
  #--------------------------------------------------------------------------
  def outside_windows_update
    return if @outside_windows_changed == false
    for i in 0..@inside_windows.size-1
      x = @x
      y = @y
      height = i
      width = Graphics.width/4
      padding = i==0?0:24
      @inside_windows[0].move(x+width*0, y+line_height*height, width, line_height+standard_padding*4)
      @inside_windows[1].move(x+width*1-12, y+line_height*height, width+24, line_height+standard_padding*4)
      @inside_windows[2].move(x+width*2-36, y+line_height*height, width+24, line_height+standard_padding*4)
      @inside_windows[3].move(x+width*3-24, y+line_height*height, width+24, line_height+standard_padding*4)
    end
    @outside_windows_changed = false
  end
  #--------------------------------------------------------------------------
  # ● inside_windows_update : 内窗口更新,仅当窗口内容发生变化时更新
  #--------------------------------------------------------------------------
  def inside_windows_update
    for i in 0..@inside_windows.size-1
      actor = $game_party.all_members
      x = y = standard_padding
      width = Graphics.width/4
      if name_change(i,actor)
        @inside_windows[0].contents.clear
        @inside_windows[0].draw_actor_name(actor, x, y, width)
      end
      if level_change(i,actor)
        @inside_windows[1].contents.clear
        @inside_windows[1].draw_actor_level(actor, x, y)
      end
      if hp_change(i,actor)
        @inside_windows[2].contents.clear
        @inside_windows[2].draw_actor_hp(actor, x, y, width)
      end
      if mp_change(i,actor)
        @inside_windows[3].contents.clear
        @inside_windows[3].draw_actor_mp(actor, x, y, width)
      end
      @inside_windows.each do |window|
        window.each do |obj|
          obj.contents_opacity = 255
        end
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● old_party_data_update : @old_party_data更新,仅当所有窗口更新完毕后更新
  #--------------------------------------------------------------------------
  def old_party_data_update
    for i in 0..@old_party_data.size-1
      actor = $game_party.all_members
      @old_party_data[0] = actor.name if name_change(i,actor)
      @old_party_data[1] = actor.level if level_change(i,actor)
      @old_party_data[2] = actor.hp if hp_change(i,actor)
      @old_party_data[3] = actor.mp if mp_change(i,actor)
    end
  end
  #--------------------------------------------------------------------------
  # ● *_change : 检查需要显示的队伍数据是否发生变化
  #--------------------------------------------------------------------------
  def name_change(index = 0,actor)
    return @old_party_data[index][0]!=actor.name
  end
  
  def level_change(index = 0,actor)
    return @old_party_data[index][1]!=actor.level
  end
  
  def hp_change(index = 0,actor)
    return @old_party_data[index][2]!=actor.hp || @old_party_data[index][3]!=actor.mhp
  end
  
  def mp_change(index = 0,actor)
    return @old_party_data[index][4]!=actor.mp || @old_party_data[index][5]!=actor.mmp
  end
  #--------------------------------------------------------------------------
  # ● old_party_data
  #--------------------------------------------------------------------------
  def old_party_data
    @old_party_data
  end
  #--------------------------------------------------------------------------
  # ● need_dispose :检查是否需要销毁窗口,在必要时(卡顿等)返回撤销命令
  #--------------------------------------------------------------------------
  def need_dispose
    return true if @old_party_data.size != $game_party.all_members.size
    actor = $game_party.all_members
    for i in 0..@old_party_data.size-1
      return true if @old_party_data[0] != actor.name
      return true if @old_party_data[1] != actor.level
      return true if @old_party_data[3] != actor.mhp
      return true if @old_party_data[5] != actor.mmp
    end
    return false
  end
  #--------------------------------------------------------------------------
  # ● dispose :销毁窗口
  #--------------------------------------------------------------------------
  def dispose
    super
    @inside_windows.each do |window|
      window.each do |obj|
        obj.dispose
      end
    end
  end
end

class Scene_Map
  alias old_start start
  def start
    old_start
    @Window_SimpleStatus = Window_SimpleStatus.new
  end
  
  alias old_pre_terminate pre_terminate
  def pre_terminate
    old_pre_terminate
    @Window_SimpleStatus.dispose
  end
  
  alias old_update update
  def update
    old_update
    if @Window_SimpleStatus.need_dispose
      @Window_SimpleStatus.dispose
      @Window_SimpleStatus = Window_SimpleStatus.new
    end
  end
end
[/pre]

附图

附图

点评

感谢喵呜大的提醒~  发表于 2016-1-7 12:05
欢迎回来,提个建议:定义方法以及alias起名的时候建议至少用 old_当天的日期_名字 ,直接用 old_名字 ,很容易和其他人的名字起冲突导致脚本报错  发表于 2016-1-7 10:33

评分

参与人数 2星屑 +200 梦石 +1 收起 理由
taroxd + 1 认可答案
喵呜喵5 + 200 我很赞同

查看全部评分

pokemon 和 digimon 正在路上
回复

使用道具 举报

梦石
0
星屑
1297
在线时间
995 小时
注册时间
2014-12-14
回帖
2939

开拓者

发表于 2016-1-8 23:29:59 | 显示全部楼层
本帖最后由 Vortur 于 2016-1-8 23:31 编辑

可以尝试使用喵呜的“地图显示变量”,缺点是没有脸图和血条,只能显示数值。
也可以使用ABS和XBS系统,这两个功能做得很棒,缺点是设置很复杂。
还有一种是自己直接编写脚本,在下看楼上的就很好。
{:2_276:}不知帮到你没有
【RMVA教程】
---------------------
欲买桂花同载酒,终不似,少年游.
回复

使用道具 举报

梦石
0
星屑
62
在线时间
44 小时
注册时间
2015-5-11
回帖
23
 楼主| 发表于 2016-1-9 04:13:24 | 显示全部楼层
505681468 发表于 2016-1-6 22:42
试试这个看看?不知道还有什么bug和卡顿情况...

class Window_SimpleStatus < Window_Base

不过我用上脚本一直报错,不知道是怎么回事  图片 aaa.jpg

点评

不要用 for 循环可以有效避免这个问题hhh  发表于 2016-1-9 09:47
大概是没有用code窗口直接把代码粘贴到编辑窗口的时候被添加上去的2333  发表于 2016-1-9 09:34
把 [email] 和 [/email] 删了  发表于 2016-1-9 08:43
回复

使用道具 举报

梦石
0
星屑
62
在线时间
44 小时
注册时间
2015-5-11
回帖
23
 楼主| 发表于 2016-1-9 12:04:49 | 显示全部楼层
505681468 发表于 2016-1-6 22:42
[ 本帖最后由 505681468 于 2016-1-9 11:04 编辑 ]\n\n试试这个看看?不知道还有什么bug和卡顿情况 ...

多谢了,你们会脚本的真是厉害呀
回复

使用道具 举报

梦石
0
星屑
995
在线时间
4 小时
注册时间
2016-1-10
回帖
1
发表于 2016-1-29 11:38:59 | 显示全部楼层
矮油~多谢啦。
回复

使用道具 举报

梦石
0
星屑
50
在线时间
122 小时
注册时间
2016-1-23
回帖
20
发表于 2016-1-29 12:37:49 | 显示全部楼层
谢谢{:2_274:}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部