查看: 2737|回复: 11

[已经解决] 【脚本请教】战斗血条为何没有显示

[复制链接]
梦石
0
星屑
143
在线时间
62 小时
注册时间
2015-5-24
回帖
44
发表于 2017-4-14 09:00:51 | 显示全部楼层 |阅读模式

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

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

×
小弟今天改游戏血条,在脚本异常中改改改。。
然而在测试过程中并没有出现脚本错误现象之后,战斗血条并没有显示在画面,
这是为什么呢? 该如何解决?
   在线等前辈高级回答。。。。

代码如下。[pre lang="ruby"]#==============================================================================
# ■ Sprite_Battler
#------------------------------------------------------------------------------
#  战斗显示用活动块。Game_Battler 类的实例监视、
# 活动块的状态的监视。
#==============================================================================

class Sprite_Battler < RPG::Sprite
  #--------------------------------------------------------------------------
  # ● 定义实例变量
  #--------------------------------------------------------------------------
  attr_accessor :battler                  # 战斗者
  #--------------------------------------------------------------------------
  # ● 初始化对像
  #     viewport : 显示端口
  #     battler  : 战斗者 (Game_Battler)
  #--------------------------------------------------------------------------
  def initialize(viewport, battler = nil)
    super(viewport)
    @battler = battler
    @battler_visible = false
    #★★★★★★★★★★★★
    @nx = 0
    @xbit = 0
    @sprite_contens = Sprite.new
    @sprite_contens.x = 0
    @sprite_contens.y = 0
    @sprite_contens.bitmap = Bitmap.new(72,48)
    @battler_hp = 0
    @battler_sp = 0

    #★★★★★★★★★★★★
  end
  #--------------------------------------------------------------------------
  # ● 释放
  #--------------------------------------------------------------------------
  def dispose
    if self.bitmap != nil
      self.bitmap.dispose
    end

  
  if @sprite_contens !=nil
    @sprite_contens.bitmap.dispose
    @sprite_contens.dispose
    @sprite_contens = nil
   super
end
   end
  
   
  def draw_battle_hp(actor, x, y)
    # 底图描绘
    battle_hp_bitmap = RPG::Cache.picture("战斗条框")
    src_rect = Rect.new(0, 0, battle_hp_bitmap.width, battle_hp_bitmap.height)
    @sprite_contens.bitmap.blt(x, y, battle_hp_bitmap, src_rect)
    # 血条显示
    battle_hp_bitmap = RPG::Cache.picture("战斗血条")
    hp_width = battle_hp_bitmap.width * actor.hp / actor.maxhp
    src_rect = Rect.new(0, 0, hp_width, battle_hp_bitmap.height)
    @sprite_contens.bitmap.blt(x, y, battle_hp_bitmap, src_rect)
  end
  #--------------------------------------------------------------------------
  # ● 战斗法条描绘
  #--------------------------------------------------------------------------
  def draw_battle_sp(actor, x, y)
    # 底图描绘
    battle_sp_bitmap = RPG::Cache.picture("战斗条框")
    src_rect = Rect.new(0, 0, battle_sp_bitmap.width, battle_sp_bitmap.height)
    @sprite_contens.bitmap.blt(x, y, battle_sp_bitmap, src_rect)
    # 法条显示
    battle_sp_bitmap = RPG::Cache.picture("战斗法条")
    sp_width = battle_sp_bitmap.width * actor.sp / actor.maxsp
    src_rect = Rect.new(0, 0, sp_width, battle_sp_bitmap.height)
    @sprite_contens.bitmap.blt(x, y, battle_sp_bitmap, src_rect)
  end
  #--------------------------------------------------------------------------
  # ● 战斗中名字的描绘
  #--------------------------------------------------------------------------
  def draw_actor_name(actor, x, y)
    @sprite_contens.bitmap.font.color = Color.new(0, 230, 50, 255)
    @sprite_contens.bitmap.font.size = 16
    @sprite_contens.bitmap.draw_text(x, y, 60, 32, actor.name,1)
  end
  
  #--------------------------------------------------------------------------
  # ● 刷新画面
  #--------------------------------------------------------------------------
  def update
    super
    # 战斗者为 nil 的情况下
    if @battler == nil
      self.bitmap = nil
      loop_animation(nil)
      return
    end
    #刷新战斗血条
    if @battler.is_a?(Game_Actor)
      if not @sprite_contens.disposed?
        if @battler_hp == 0 and not @battler.dead?
          @sprite_contens.bitmap.clear
          @sprite_contens.x = @battler.screen_x - 30
          @sprite_contens.y = @battler.screen_y - 20
          draw_actor_name(@battler, 0, 0)
          draw_battle_sp(@battler, 0, 27)
          draw_battle_hp(@battler, 0, 35)
          @battler_hp = @battler.hp
        elsif @battler_hp != @battler.hp #and $scene.phase4_step == 6
          @sprite_contens.bitmap.clear
          @sprite_contens.x = @battler.screen_x - 30
          @sprite_contens.y = @battler.screen_y - 20
          draw_actor_name(@battler, 0, 0)
          draw_battle_sp(@battler, 0, 27)
          draw_battle_hp(@battler, 0, 35)
          @battler_hp = @battler.hp
        elsif @battler_sp != @battler.sp #and $scene.phase4_step == 6
          @sprite_contens.bitmap.clear
          @sprite_contens.x = @battler.screen_x - 30
          @sprite_contens.y = @battler.screen_y - 20
          draw_actor_name(@battler, 0, 0)
          draw_battle_sp(@battler, 0, 27)
          draw_battle_hp(@battler, 0, 35)
          @battler_sp = @battler.sp
        end
        if @wait_count.to_i != 0
          @sprite_contens.visible = false
        else
          @sprite_contens.visible = true
        end
      end
    elsif @battler.is_a?(Game_Enemy)
      unless @sprite_contens.disposed?
        if @battler.hp0?
          @sprite_contens.bitmap.clear
        end
      if @wait_count.to_i != 0
        @sprite_contens.visible = false
      else
        @sprite_contens.visible = true
      end
      end
    end

   
    # 文件名和色相与当前情况有差异的情况下
    if @battler.battler_name != @battler_name or
       @battler.battler_hue != @battler_hue
      @battler_hue = @battler.battler_hue
      # 获取、设置位图
      @battler_name = @battler.battler_name
      self.bitmap = RPG::Cache.battler(@battler_name, @battler_hue)
      @width = bitmap.width
      @height = bitmap.height
      self.ox = @width / 2
      self.oy = @height
      # 如果是战斗不能或者是隐藏状态就把透明度设置成 0
      if @battler.is_a?(Game_Enemy)
        if @battler.dead? or @battler.hidden
          #self.opacity = 0
        end
      end
    end
   
    #★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
    #if  
    @nx += 1
      @nx %= 40
      @xbit = @nx / 10 * self.bitmap.width/4
      self.src_rect.set(@xbit, 0, self.bitmap.width/4, self.bitmap.height)
    #end
    #★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
   
    # 动画 ID 与当前的情况有差异的情况下
    if @battler.state_animation_id != @state_animation_id and @battler.damage == nil
      @state_animation_id = @battler.state_animation_id
      loop_animation($data_animations[@state_animation_id])
    end
    # 应该被显示的角色的情况下
    if @battler.is_a?(Game_Actor) and @battler_visible
      # 不是主状态的时候稍稍降低点透明度
      if $game_temp.battle_main_phase
        #self.opacity += 3 if self.opacity < 255
      else
        #self.opacity -= 3 if self.opacity > 207
      end
    end
    if @battler.is_a?(Game_Actor) and self.xiaoshi != nil and self.xiaoshi > 0
       @battler.xiaoshi = 0

       self.xiaoshi -= 1
       if $status_shu == nil
          $status_shu = 0
       end
    elsif @battler.xiaoshi == 0 and self.xiaoshi <= 0
       @battler.xiaoshi = nil
       $status_shu = nil
    end
      
      
      
    # 明灭
    if @battler.blink
      blink_on
    else
      blink_off
    end
    # 不可见的情况下
    unless @battler_visible
      # 出现 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
      if not @battler.hidden and not @battler.dead? and
         (@battler.damage == nil or @battler.damage_pop)
        if @battler.is_a?(Game_Enemy)
          appear
        else
          @battler.battler_name = @battler.battler_name.split(/★/)[0]
        end
        @battler_visible = true
      end
    end
    # 可见的情况下
    if @battler_visible
      # 逃跑
      if @battler.hidden
        $game_system.se_play($data_system.escape_se)
        escape
        @battler_visible = false
      end
      # 白色闪烁
      if @battler.white_flash
        whiten
        @battler.white_flash = false
      end
      # 动画
      if @battler.animation_id != 0
        animation = $data_animations[@battler.animation_id]
        animation(animation, @battler.animation_hit)
        @battler.animation_id = 0
      end
      # 伤害
      if @battler.damage_pop
        damage(@battler.damage, @battler.critical)
        @battler.damage = nil
        @battler.critical = false
        @battler.damage_pop = false
      end
      # korapusu★★★★★★★★★★★★★★★★★★★★★★★★★★★★
      if @battler.damage == nil and @battler.dead?
        if @battler.is_a?(Game_Enemy)
          $game_system.se_play($data_system.enemy_collapse_se)
          collapse
        else
          $game_system.se_play($data_system.actor_collapse_se)
          @battler.battler_name = @battler.battler_name.split(/★/)[0]
          @battler.battler_name = @battler.battler_name + "★2"
        end
        @battler_visible = false
      end
    end
       if @flash_shake_switch == true
      self.x = @battler.screen_x
      self.y = @battler.screen_y
      self.z = @battler.screen_z
      @flash_shake_switch = false
      if @battler.is_a?(Game_Actor)
        @sprite_contens.bitmap.clear
        @sprite_contens.x = @battler.screen_x - 30
        @sprite_contens.y = @battler.screen_y - 20
        draw_actor_name(@battler, 0, 0)
        draw_battle_sp(@battler, 0, 27)
        draw_battle_hp(@battler, 0, 35)
      elsif @battler.is_a?(Game_Enemy)
        @sprite_contens.bitmap.clear
        @sprite_contens.x = @battler.screen_x - 30
        @sprite_contens.y = @battler.screen_y - 20
        draw_actor_name(@battler, 0, 0)
      end
    end
    # 设置活动块的坐标
    if @battler.is_a?(Game_Actor)
     self.x = @battler.s_x
     self.y = @battler.s_y
     self.z = @battler.s_z
    else
     self.x = @battler.screen_x
     self.y = @battler.screen_y
     self.z = @battler.screen_z
    end
  end
end
[/pre]
梦石
0
星屑
9557
在线时间
5074 小时
注册时间
2013-6-21
回帖
3459

开拓者贵宾剧作品鉴家

发表于 2017-4-14 09:33:43 | 显示全部楼层
脚本改动较多导致我在新工程下测试很痛苦。

如果是在 Sprite_Battler 下修改,请将生成的血条等图片放在同一个端口(viewport)下,否则会被端口遮挡从而看不到。

具体来说,脚本 25 行
[pre lang="Ruby"]@sprite_contens = Sprite.new
[/pre]

需要变成
[pre lang="Ruby"]@sprite_contens = Sprite.new(viewport)
[/pre]
其中 viewport 就是 initialize 参数那个 viewport。

另外代码里有变量名等小错误,请自行修正。
回复

使用道具 举报

梦石
0
星屑
143
在线时间
62 小时
注册时间
2015-5-24
回帖
44
 楼主| 发表于 2017-4-14 09:58:31 | 显示全部楼层
RyanBern 发表于 2017-4-14 09:33
脚本改动较多导致我在新工程下测试很痛苦。

如果是在 Sprite_Battler 下修改,请将生成的血条等图片放在同 ...

感谢版主回答,
但是看不懂阿, 之前我就改动过Sprite.new(viewport),但并没啥用阿.
回复

使用道具 举报

梦石
0
星屑
34459
在线时间
5096 小时
注册时间
2012-11-19
回帖
4715

开拓者

发表于 2017-4-14 11:07:44 | 显示全部楼层
本帖最后由 芯☆淡茹水 于 2017-4-14 11:29 编辑

粗略看了下,可能是显示端口问题,还有可能是没赋值 Z 值给血条。

对于写惯了血条的来说,完全可以简略很多,也很容易找出问题所在。

前面初始化只留两条,其它都不需要
@sprite_contens = Sprite.new(viewport)
@sprite_contens.bitmap = Bitmap.new(72,48)

  1. #==============================================================================
  2. class Sprite_Battler < RPG::Sprite
  3.   #--------------------------------------------------------------------------
  4.   def update
  5.     unless @battler.nil?  #战斗者存在的情况下
  6.       #在用于记录血量的 @data_hp 与战斗者血量有变动的情况下,重新描绘血槽。
  7.       draw_battle_hp(x, y) if @data_hp != @battler.hp
  8.       #在用于记录法术值的 @data_sp 与战斗者法术值有变动的情况下,重新描绘法槽。
  9.       draw_battle_sp(x, y) if @data_sp != @battler.sp
  10.     end
  11.     #以下默认脚本
  12.     #。
  13.     #。
  14.     #。
  15.     #。
  16.     #然后确定血条图片什么情况下显示(比如和战斗图片一同显示)
  17.     @sprite_contens.visible = @battler_visible
  18.     #最后要随时确定血条图片的位置。
  19.     @sprite_contens.x = @battler.screen_x - 30
  20.     @sprite_contens.y = @battler.screen_y - 20
  21.     @sprite_contens.z = @battler.screen_z #或者可以再加一点,比如+5,比战斗图片高点。
  22.   end
  23.   #--------------------------------------------------------------------------
  24.   # ● 战斗血条描绘
  25.   #--------------------------------------------------------------------------
  26.   def draw_battle_hp(x, y)
  27.     #记录当前血量
  28.     @data_hp = @battler.hp
  29.     #清除以前显示的。
  30.     @sprite_contens.bitmap.clear
  31.     # 底图描绘
  32.     battle_hp_bitmap = RPG::Cache.picture("战斗条框")
  33.     src_rect = Rect.new(0, 0, battle_hp_bitmap.width, battle_hp_bitmap.height)
  34.     @sprite_contens.bitmap.blt(x, y, battle_hp_bitmap, src_rect)
  35.     # 血条显示
  36.     battle_hp_bitmap = RPG::Cache.picture("战斗血条")
  37.     hp_width = battle_hp_bitmap.width * @battler.hp / @battler.maxhp
  38.     src_rect = Rect.new(0, 0, hp_width, battle_hp_bitmap.height)
  39.     @sprite_contens.bitmap.blt(x, y, battle_hp_bitmap, src_rect)
  40.   end
  41.   #--------------------------------------------------------------------------
  42.   # ● 战斗法条描绘
  43.   #--------------------------------------------------------------------------
  44.   def draw_battle_sp(x, y)
  45.     #记录当前法术值
  46.     @data_sp = @battler.sp
  47.     #清除以前显示的。
  48.     @sprite_contens.bitmap.clear
  49.     # 底图描绘
  50.     battle_sp_bitmap = RPG::Cache.picture("战斗条框")
  51.     src_rect = Rect.new(0, 0, battle_sp_bitmap.width, battle_sp_bitmap.height)
  52.     @sprite_contens.bitmap.blt(x, y, battle_sp_bitmap, src_rect)
  53.     # 法条显示
  54.     battle_sp_bitmap = RPG::Cache.picture("战斗法条")
  55.     sp_width = battle_sp_bitmap.width * @battler.sp / @battler.maxsp
  56.     src_rect = Rect.new(0, 0, sp_width, battle_sp_bitmap.height)
  57.     @sprite_contens.bitmap.blt(x, y, battle_sp_bitmap, src_rect)
  58.   end
  59. end
  60. #==============================================================================
复制代码

点评

怎么说呢,就跟截图的方法是 map_shop 那种一样~  发表于 2017-4-14 13:08
没写错啊,变量名是随便取的。  发表于 2017-4-14 13:06
原来是作者自己写错了>_<  发表于 2017-4-14 12:56
是 contents 吧  发表于 2017-4-14 12:40
xp vx va mv  va mz 各类型脚本/插件定制
回复

使用道具 举报

梦石
0
星屑
143
在线时间
62 小时
注册时间
2015-5-24
回帖
44
 楼主| 发表于 2017-4-14 18:59:39 | 显示全部楼层
芯☆淡茹水 发表于 2017-4-14 11:07
粗略看了下,可能是显示端口问题,还有可能是没赋值 Z 值给血条。

对于写惯了血条的来说,完全可以简略很 ...

非常感谢版主又耐心回答我的问题,
回复

使用道具 举报

梦石
0
星屑
34459
在线时间
5096 小时
注册时间
2012-11-19
回帖
4715

开拓者

发表于 2017-4-14 19:49:43 | 显示全部楼层
本帖最后由 芯☆淡茹水 于 2017-4-14 19:52 编辑
梦想始终会醒 发表于 2017-4-14 18:59
非常感谢版主又耐心回答我的问题,


我忽略了一个问题,描绘血和法的精灵是同一个,那么应该改为:

[pre lang="ruby"]#==============================================================================
class Sprite_Battler < RPG::Sprite
  #--------------------------------------------------------------------------
  def update
    unless @battler.nil?  
      if @data_hp != @battler.hp or if @data_sp != @battler.sp
        @sprite_contens.bitmap.clear
        draw_battle_hp(x, y)
        draw_battle_sp(x, y)
      end
    end
    #以下默认脚本
    #。
    #。
    #。
    #。
    #然后确定血条图片什么情况下显示(比如和战斗图片一同显示)
    @sprite_contens.visible = @battler_visible
    #最后要随时确定血条图片的位置。
    @sprite_contens.x = @battler.screen_x - 30
    @sprite_contens.y = @battler.screen_y - 20
    @sprite_contens.z = @battler.screen_z #或者可以再加一点,比如+5,比战斗图片高点。
  end
  #--------------------------------------------------------------------------
  # ● 战斗血条描绘
  #--------------------------------------------------------------------------
  def draw_battle_hp(x, y)
    #记录当前血量
    @data_hp = @battler.hp
    # 底图描绘
    battle_hp_bitmap = RPG::Cache.picture("战斗条框")
    src_rect = Rect.new(0, 0, battle_hp_bitmap.width, battle_hp_bitmap.height)
    @sprite_contens.bitmap.blt(x, y, battle_hp_bitmap, src_rect)
    # 血条显示
    battle_hp_bitmap = RPG::Cache.picture("战斗血条")
    hp_width = battle_hp_bitmap.width * @battler.hp / @battler.maxhp
    src_rect = Rect.new(0, 0, hp_width, battle_hp_bitmap.height)
    @sprite_contens.bitmap.blt(x, y, battle_hp_bitmap, src_rect)
  end
  #--------------------------------------------------------------------------
  # ● 战斗法条描绘
  #--------------------------------------------------------------------------
  def draw_battle_sp(x, y)
    #记录当前法术值
    @data_sp = @battler.sp
    # 底图描绘
    battle_sp_bitmap = RPG::Cache.picture("战斗条框")
    src_rect = Rect.new(0, 0, battle_sp_bitmap.width, battle_sp_bitmap.height)
    @sprite_contens.bitmap.blt(x, y, battle_sp_bitmap, src_rect)
    # 法条显示
    battle_sp_bitmap = RPG::Cache.picture("战斗法条")
    sp_width = battle_sp_bitmap.width * @battler.sp / @battler.maxsp
    src_rect = Rect.new(0, 0, sp_width, battle_sp_bitmap.height)
    @sprite_contens.bitmap.blt(x, y, battle_sp_bitmap, src_rect)
  end
end[/pre]

评分

参与人数 1星屑 +100 梦石 +1 收起 理由
RyanBern + 100 + 1 认可答案

查看全部评分

xp vx va mv  va mz 各类型脚本/插件定制
回复

使用道具 举报

梦石
0
星屑
143
在线时间
62 小时
注册时间
2015-5-24
回帖
44
 楼主| 发表于 2017-4-16 08:35:22 | 显示全部楼层
芯☆淡茹水 发表于 2017-4-14 19:49
我忽略了一个问题,描绘血和法的精灵是同一个,那么应该改为:

#===================================== ...

非常感谢!
回复

使用道具 举报

梦石
0
星屑
50
在线时间
8 小时
注册时间
2017-4-16
回帖
11
发表于 2017-4-16 18:48:06 | 显示全部楼层
芯☆淡茹水 发表于 2017-4-14 19:49
我忽略了一个问题,描绘血和法的精灵是同一个,那么应该改为:

#===================================== ...

请问一下大佬,这个代码能直接用吗?如果能的话,应该在那哪?之前复制了一次,但还是不行,不知道是不是把代码放错位置了……
回复

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部