查看: 2376|回复: 4

[有事请教] 血条释放还是刷新异常

[复制链接]
梦石
0
星屑
3850
在线时间
1899 小时
注册时间
2010-6-19
回帖
917
发表于 2023-4-14 11:02:16 | 显示全部楼层 |阅读模式
悬赏500星屑未解决
本帖最后由 黑米馒头 于 2023-4-17 13:40 编辑

裂开了,搞了个召还宠物的功能,战斗时候召还宠物时,血条刷新显示异常,这是啥情况。。。

没召还前

1.png

召还后

2.png

每次召还宠物后,都会留下几个血条,这是刷新的原因还是没释放干净?


下面的脚本也没看到哪里可以控制释放窗口的地方~

我目前用这几条代码控制血条刷新的,角色受伤时血条刷新都正常

    # 打开血条刷新
    $game_temp.enemy_hpsp_refresh = true
    # 刷新图片活动块
    @spriteset.update
    # 关闭血条刷新
    $game_temp.enemy_hpsp_refresh = false


我的逻辑是,收回宠物的时候,释放血条窗口,
但是class Sprite_Battler < RPG::Sprite,里面好像没有释放血条窗口的设定


[fold=血条脚本]#==============================================================================
module PLAN_HPSP_DRAW
  DRAW_NAME         = false        # 名字     描画
  DRAW_HP           = true         # HP血条   描画
  DRAW_SP           = true         # SP蓝条   描画

  DRAW_HP1          = true         # HP数字   描画
  DRAW_SP1          = true         # SP数字   描画

end

#==============================================================================
# ■ Sprite_Battler
#==============================================================================

class Sprite_Battler < RPG::Sprite
  alias plan_enemy_hpsp_draw_initialize initialize
  def initialize(viewport, battler = nil)
    plan_enemy_hpsp_draw_initialize(viewport, battler)
    width = 120; height = 64
    @enemy_hpsp_window = Window_Base.new(x, y, width, height)
    @enemy_hpsp_window.contents = Bitmap.new(width - 32, height - 32)
    # 生成活动块
    @old_enemy_hpsp = []
    # 窗口透明度
    @enemy_hpsp_window.opacity = 0
    # 内容透明度
    @enemy_hpsp_window.contents_opacity = 255
    # 当角色ID > 50
    if @battler.is_a?(Game_Actor) && @battler.id > 50
      # 隐藏窗口可见度【可见度和战斗图关联】
      @enemy_hpsp_window.visible = @battler_visible
    else
    end
  end
  #--------------------------------------------------------------------------
  # ● 刷新画面
  #--------------------------------------------------------------------------
  alias plan_enemy_hpsp_draw_update update
  # 定义刷新
  def update

    # 刷新成原样
    plan_enemy_hpsp_draw_update
    # 角色的情况下
    if @battler.is_a?(Game_Actor)
      
      if @battler.is_a?(Game_Actor) && @battler.id > 50
         @enemy_hpsp_window.visible = @battler_visible   
      else
      end

      # 生成活动块
      @now_enemy_hpsp = []

      # 窗口 名字 显示的情况  
      if PLAN_HPSP_DRAW::DRAW_NAME
        @now_enemy_hpsp.push(@battler.name)
      end
      # 窗口 HP 显示的情况
      if PLAN_HPSP_DRAW::DRAW_HP
        @now_enemy_hpsp.push(@battler.hp)
      end
      # 窗口 SP 显示的情况
      if PLAN_HPSP_DRAW::DRAW_SP
        @now_enemy_hpsp.push(@battler.sp)
      end
      if @old_enemy_hpsp != @now_enemy_hpsp and $game_temp.enemy_hpsp_refresh
        @old_enemy_hpsp = @now_enemy_hpsp
        # 窗口描绘文本
        @enemy_hpsp_window.contents.clear
        # 定义长度
        width = 212
        # 窗口 名字 显示的情况
        if PLAN_HPSP_DRAW::DRAW_NAME
          # 窗口名字的描绘
          @enemy_hpsp_window.draw_actor_name1(@battler, -60, -5, width - 32)
        end
        
        # 窗口 血条 显示的情况
        if PLAN_HPSP_DRAW::DRAW_HP
          # 窗口 HP 的描绘
          @enemy_hpsp_window.draw_actor_hp_h(@battler, 11, -74, width - 144)
        end
        # 窗口 蓝条 显示的情况
        if PLAN_HPSP_DRAW::DRAW_SP
          # 窗口 SP 的描绘
          @enemy_hpsp_window.draw_actor_sp_s(@battler, 11, -64, width - 144)
        end   

        # 窗口 HP数值 显示的情况
        if PLAN_HPSP_DRAW::DRAW_HP1
          # 字体大小
          @enemy_hpsp_window.contents.font.size = 13
          # 描绘字体样式
          @enemy_hpsp_window.contents.font.name = "Segoe.ttf"
          # 窗口 HP 的描绘
          @enemy_hpsp_window.draw_actor_hp1(@battler, -85, -6, width - 32)
        end
        # 窗口 SP数值 显示的情况
        if PLAN_HPSP_DRAW::DRAW_SP1
          # 字体大小
          @enemy_hpsp_window.contents.font.size = 13
          # 描绘字体样式
          @enemy_hpsp_window.contents.font.name = "Segoe.ttf"         
          # 窗口 SP 的描绘
          @enemy_hpsp_window.draw_actor_sp1(@battler, -85, 5, width - 32)
        end
      
        # 图样帧重设
        Graphics.frame_reset
      end
    end
  end
end
#==============================================================================
# ■ Game_Temp
#==============================================================================
class Game_Temp
  #--------------------------------------------------------------------------
  # ● 公开实例变量
  #--------------------------------------------------------------------------
  attr_accessor :enemy_hpsp_refresh
  #--------------------------------------------------------------------------
  # ● 对象初始化
  #--------------------------------------------------------------------------
  alias plan_enemy_hpsp_draw_initialize initialize
  def initialize
    # 恢复原来的方法
    plan_enemy_hpsp_draw_initialize
    # 开启刷新
    @enemy_hpsp_refresh = true
  end
end
#==============================================================================
# ■ Scene_Battle
#==============================================================================
class Scene_Battle
  #--------------------------------------------------------------------------
  # ● 预战斗阶段开始
  #--------------------------------------------------------------------------
  alias plan_enemy_hpsp_draw_start_phase1 start_phase1
  def start_phase1
    # 战斗血条蓝条刷新关闭
    $game_temp.enemy_hpsp_refresh = false
    # 执行指令
    plan_enemy_hpsp_draw_start_phase1
  end
  #--------------------------------------------------------------------------
  # ● 开始方命令阶段
  #--------------------------------------------------------------------------
  alias plan_enemy_hpsp_draw_start_phase2 start_phase2
  def start_phase2
    # 执行指令
    plan_enemy_hpsp_draw_start_phase2
  end
  #--------------------------------------------------------------------------
  # ● 框架更新(主阶段步骤5:伤害表示)
  #--------------------------------------------------------------------------
  alias plan_enemy_hpsp_draw_update_phase4_step5 update_phase4_step5
  def update_phase4_step5
    # 执行指令
    plan_enemy_hpsp_draw_update_phase4_step5
  end  
  #--------------------------------------------------------------------------
  # ● 框架更新(主阶段步骤6:刷新)
  #--------------------------------------------------------------------------
  alias plan_enemy_hpsp_draw_update_phase4_step6 update_phase4_step6
  def update_phase4_step6
    # 执行指令
    plan_enemy_hpsp_draw_update_phase4_step6
  end
end[/fold]

点评

自己解决了  发表于 2023-4-17 09:38

评分

参与人数 1赞 +1 收起 理由
金芒芒 + 1 塞糖

查看全部评分

梦石
0
星屑
7296
在线时间
1244 小时
注册时间
2015-8-15
回帖
473
发表于 2023-4-16 13:32:46 | 显示全部楼层
本帖最后由 金芒芒 于 2023-4-16 13:46 编辑

召唤的宠物 名字  图片  头像 兵种 属性多一样    系统刷新停顿一下 就会乱码 最少也要搞一个图片1,2,3 名字加个赵钱孙李   就差ID不一样了  再两个防卡脚本
防卡脚本1
[pre lang="ruby"]#===============================================================================
# Class Antilag Settings
#-------------------------------------------------------------------------------
# 防止事件过多卡机脚本
# 设置CPU线程
#===============================================================================
class Antilag_Settings
  
  attr_accessor :event
  attr_accessor :max_cpu_utilization
  attr_accessor :cpu_tolerance
  #-----------------------------------------------------------------------------
  # 初始化对象
  #-----------------------------------------------------------------------------
  def initialize
    @event = true
    @high_priority = true
    @max_cpu_utilization = 85
    #这个是控制优先级。
    @cpu_tolerance = 20
    @SetPriorityClass = Win32API.new('kernel32', 'SetPriorityClass',
                                     ['p', 'i'], 'i')
    @GetProcessTimes = Win32API.new('kernel32', 'GetProcessTimes',
                                    ['i','p','p','p','p'], 'i')
  end
  #-----------------------------------------------------------------------------
  # 更改优先级 on(true)/off(false)
  #-----------------------------------------------------------------------------
  def high_priority=(value)
    @high_priority = value

    if @high_priority
      @SetPriorityClass.call(-1, 0x00000080) # 高质量
      # 设置CPU优先级80为高。110为实时。20为标准。
    else
      @SetPriorityClass.call(-1, 0x00000020) # 标准优先
    end
  end
  #-----------------------------------------------------------------------------
  # 返回现在的CPU使用率
  #-----------------------------------------------------------------------------
  def get_cpu_utilization
    # 使用API获取内核用户调用时间
    creation_time = '0' * 10
    exit_time = '0' * 10
    kernel_time = '0' * 10
    user_time = '0' * 10
    @GetProcessTimes.call(-1, creation_time, exit_time, kernel_time, user_time)
    kernel_time = kernel_time.unpack('l2')
    user_time = user_time.unpack('l2')
    kernel_time = kernel_time[0] + kernel_time[1]
    user_time = user_time[0] + user_time[1]
    # 计算不同的CPU使用率
    if @old_time != nil
      timer_difference = Time.new - @old_timer
      time_difference = kernel_time + user_time - @old_time
      result = time_difference / timer_difference / 100000
    else
      result = $antilag.max_cpu_utilization
    end
    # 节约CPU使用(还是计算)
    @old_timer = Time.new
    @old_time = kernel_time + user_time
    return result
  end
end
$antilag = Antilag_Settings.new
#==============================================================================
# ■ Scene_Map
#------------------------------------------------------------------------------
#  处理地图画面的类。
#==============================================================================
class Scene_Map
  #-----------------------------------------------------------------------------
  # 刷新模块, 增加平滑帧数
  #-----------------------------------------------------------------------------
  alias f0tzis_anti_lag_scene_map_update update
  def update
    f0tzis_anti_lag_scene_map_update
    if Graphics.frame_count % 20 == 0 and $antilag.max_cpu_utilization <= 100
      # 计算CPU最大限度利用和当前的利用率
      abs = $antilag.max_cpu_utilization - $antilag.get_cpu_utilization
      # 如果改变帧速率的差异
      if abs.abs >= $antilag.max_cpu_utilization * $antilag.cpu_tolerance/100.0
        Graphics.frame_rate = [[10, Graphics.frame_rate + abs / 2].max, 40].min
      end
    end
  end
end

#咳咳少了几行代码
$antilag.max_cpu_utilization = 85                              
$antilag.cpu_tolerance = 20      
$antilag.high_priority = true   
$antilag.event = true
#自动回滚标准
if $antilag.max_cpu_utilization>=100
  $antilag.max_cpu_utilization=85
end    # 分歧结束。[/pre]

防卡脚本2
[pre lang="ruby"]#==============================================================================
# Módulo AntiLag
#==============================================================================
    module AntiLag
      SPC = Win32API.new("kernel32", "SetPriorityClass", "pi", "i")
      @@high_priority = false
      def self.high_priority ; @@high_priority; end
      def self.high_priority?; @@high_priority; end
      def self.high_priority=(valor)
        return if @@high_priority == valor
        @@high_priority = valor
        if @@high_priority
          SPC.call(-1, 0x80)
          return
        end
        SPC.call(-1, 0x20)
      end
    end
    AntiLag.high_priority = true[/pre]

点评

你这两个脚本对我没用~  发表于 2023-4-17 09:26
回复

使用道具 举报

梦石
0
星屑
1442
在线时间
171 小时
注册时间
2019-10-4
回帖
162
发表于 2023-4-17 10:43:17 | 显示全部楼层
这画面也太好看了
回复

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部