じ☆ve冰风 发表于 2024-4-19 20:34:03

同时显示多个状态动画 v2.01 (2011-03-02更新)

RMXP默认情况下.战斗中显示的状态动画只会显示一个.
通过这个脚本的修改使得只要战斗者拥有带状态动画的状态.
就会将其状态动画显示出来.

重新定义了 RPG::Sprite 类里跟播放循环动画有关的内容.
loop_animation
dispose_loop_animation
update_animation

# 功能:多状态动画同时显示
# 版本:2.01
# 作者:后知后觉 2011-3-2
# 使用方法:插入Main前即可
# 冲突可能:只要在你的脚本编辑器内没有对 RPG::Sprite 或 Sprite_Battler 类
#         以下三个方法做出过别的定义 则就有较大的兼容性
#         loop_animation
#         dispose_loop_animation
#         update_loop_animation

更新日志:
v2.01
1.去掉了2.0中状态定量必须大于0的限制.
2.重新设计针对按下F12后引来的一系列问题的处理办法.
3.将2.0中部分被重定义的方法改为追加定义以提高兼容性.
4.修正当某两个或以上的状态带有的是同一个状态动画时.
其中一个状态被解除时.状态动画也会被跟着消失的问题.

v2.0
重新使用新的制作思路完成这一效果.老版本的删掉了.

脚本如下:#======================================================================# 脚本来自www.66rpg.com,使用或转载请保留此信息# 功能:多状态动画同时显示# 版本:2.01# 作者:后知后觉 2011-3-2# 使用方法:插入Main前即可# 冲突可能:只要在你的脚本编辑器内没有对 RPG::Sprite 或 Sprite_Battler 类#         以下三个方法做出过别的定义 则就有较大的兼容性#         loop_animation#         dispose_loop_animation#         update_loop_animation#======================================================================module RPGclass Sprite < ::Sprite    if @hzhj_alias_method_for_state_animation.nil?      alias hzhj_old_ini_for_state_animation initialize      alias hzhj_old_update_for_state_animation update      alias hzhj_old_x_for_state_animation x=      alias hzhj_old_y_for_state_animation y=      @hzhj_alias_method_for_state_animation = true    end    def initialize(*args)      @hzhj_loop_animations = []      @hzhj_loop_sprites = {}      @hzhj_loop_index = {}      hzhj_old_ini_for_state_animation(*args)    end    def loop_animation(animation)      return if @hzhj_loop_animations.include?(animation)      if animation.nil?      dispose_loop_animation      return      end      @hzhj_loop_animations.push(animation)      @hzhj_loop_index = 0      animation_name = animation.animation_name      animation_hue = animation.animation_hue      bitmap = RPG::Cache.animation(animation_name, animation_hue)      if @@_reference_count.include?(bitmap)      @@_reference_count += 1      else      @@_reference_count = 1      end      loop_animation_sprites = []      for i in 0..15      sprite = ::Sprite.new(self.viewport)      sprite.bitmap = bitmap      sprite.visible = false      loop_animation_sprites.push(sprite)      end      @hzhj_loop_sprites = loop_animation_sprites      update_loop_animation    end    def dispose_loop_animation      if not @hzhj_loop_animations.empty?      for sprites in @hzhj_loop_sprites.values          next if sprites.nil?          sprite = sprites          if sprite != nil            @@_reference_count -= 1            if @@_reference_count == 0            sprite.bitmap.dispose            end          end          for sprite in sprites            sprite.dispose          end      end      @hzhj_loop_index.clear      @hzhj_loop_sprites.clear      @hzhj_loop_animations.clear      end    end    def update      hzhj_old_update_for_state_animation      if not @hzhj_loop_animations.empty? and (Graphics.frame_count % 2 == 0)      update_loop_animation      for animation in @hzhj_loop_animations          @hzhj_loop_index += 1          @hzhj_loop_index %= animation.frame_max      end      end    end    def update_loop_animation      for animation in @hzhj_loop_animations      frame_index = @hzhj_loop_index      cell_data = animation.frames.cell_data      position = animation.position      sprites = @hzhj_loop_sprites      animation_set_sprites(sprites, cell_data, position)      for timing in animation.timings          if timing.frame == frame_index            animation_process_timing(timing, true)          end      end      end    end    def x=(new_x)      sx = new_x - self.x      if sx != 0      if not @hzhj_loop_animations.empty?          for animation in @hzhj_loop_animations            for i in 0..15            @hzhj_loop_sprites.x += sx            end          end      end      end      hzhj_old_x_for_state_animation(new_x)    end    def y=(new_y)      sy = new_y - self.y      if sy != 0      if not @hzhj_loop_animations.empty?          for animation in @hzhj_loop_animations            for i in 0..15            @hzhj_loop_sprites.y += sy            end          end      end      end      hzhj_old_y_for_state_animation(new_y)    end    def stop_loop_animation(animation)      return if not @hzhj_loop_animations.include?(animation)      if not @battler.nil?      for i in @battler.states          next if $data_states.nil?          if $data_states.animation_id == animation.id            return          end      end      end      sprites = @hzhj_loop_sprites      sprite = sprites      if sprite != nil      @@_reference_count -= 1      if @@_reference_count == 0          sprite.bitmap.dispose      end      end      for sprite in sprites      sprite.dispose      end      @hzhj_loop_index = 0      @hzhj_loop_sprites = nil      @hzhj_loop_animations.delete(animation)    endendend#==============================================================================# ■ Game_Battler#==============================================================================class Game_Battlerif @hzhj_alias_method_for_state_animation.nil?    alias hzhj_old_ini_gb_state_animation initialize    alias hzhj_old_add_state add_state    alias hzhj_old_remove_state remove_state    @hzhj_alias_method_for_state_animation = trueend#--------------------------------------------------------------------------# ● 定义实例变量#--------------------------------------------------------------------------attr_reader   :hzhj_add_state_idattr_reader   :hzhj_remove_state_id#--------------------------------------------------------------------------# ● 初始化对像#--------------------------------------------------------------------------def initialize    @hzhj_add_state_id = []    @hzhj_remove_state_id = []    hzhj_old_ini_gb_state_animationend#--------------------------------------------------------------------------# ● 附加状态#--------------------------------------------------------------------------def add_state(state_id, force = false)    old_states = @states.clone    hzhj_old_add_state(state_id, force)    return if old_states == @states    zjdzt = (@states | old_states) & @states    jsdzt = (@states | old_states) & old_states    for i in zjdzt      if $data_states.animation_id > 0      if not @hzhj_add_state_id.include?(i)          @hzhj_add_state_id.push(i)      end      end    end    for i in jsdzt      if $data_states.animation_id > 0      if not @hzhj_remove_state_id.include?(i)          @hzhj_remove_state_id.push(i)      end      end    endend#--------------------------------------------------------------------------# ● 解除状态#--------------------------------------------------------------------------def remove_state(state_id, force = false)    old_states = @states.clone    hzhj_old_remove_state(state_id, force)    return if old_states == @states    zjdzt = (@states | old_states) & @states    jsdzt = (@states | old_states) & old_states    for i in zjdzt      if $data_states.animation_id > 0      if not @hzhj_add_state_id.include?(i)          @hzhj_add_state_id.push(i)      end      end    end    for i in jsdzt      if $data_states.animation_id > 0      if not @hzhj_remove_state_id.include?(i)          @hzhj_remove_state_id.push(i)      end      end    endendend#==============================================================================# ■ Sprite_Battler#==============================================================================class Sprite_Battler < RPG::Spriteif @hzhj_alias_sb_for_state_animation.nil?    alias hzhj_old_init_sb_for_state_animation initialize    alias hzhj_old_update_sb_for_state_animation update    @hzhj_alias_sb_for_state_animation = trueend#--------------------------------------------------------------------------# ● 初始化#--------------------------------------------------------------------------def initialize(*args)    hzhj_old_init_sb_for_state_animation(*args)    if not @battler.nil?      @battler.hzhj_add_state_id.clear      @battler.hzhj_remove_state_id.clear      for i in @battler.states      next if $data_states.nil?      next if $data_states.animation_id == 0      next if $data_animations[$data_states.animation_id].nil?      @battler.hzhj_add_state_id.push(i)      end    endend#--------------------------------------------------------------------------# ● 刷新#--------------------------------------------------------------------------def update    hzhj_old_update_sb_for_state_animation    if not @battler.nil?      if @battler.damage.nil?      if not @battler.hzhj_add_state_id.empty?          for i in @battler.hzhj_add_state_id            if @battler.state?(i)            animation_id = $data_states.animation_id            animation = $data_animations            loop_animation(animation) if not animation.nil?            end          end          @battler.hzhj_add_state_id.clear      end      if not @battler.hzhj_remove_state_id.empty?          for i in @battler.hzhj_remove_state_id            if not @battler.state?(i)            animation_id = $data_states.animation_id            animation = $data_animations            stop_loop_animation(animation) if not animation.nil?            end          end          @battler.hzhj_remove_state_id.clear      end      end    endendend#======================================================================# 脚本来自 www.66rpg.com 使用或转载请保留此信息# 功能:多状态动画同时显示# 版本:2.01# 作者:后知后觉 2011-3-2# 使用方法:插入Main前即可#======================================================================复制代码以下内容是给梦幻群侠传系统加的本脚本的一个补丁:
其实就是重新定义了一下 update_loop_animation
使用方法:
将本系统主脚本放在 Main 的上面 and 【KDS改】原内部数据 的下面.
然后将此补丁放在本系统主脚本的下面即可.#======================================================================# 脚本来自www.66rpg.com,使用或转载请保留此信息# 功能:多状态动画同时显示 梦幻群侠传系统专用补丁# 版本:2.01# 作者:后知后觉 2011-3-7# 使用方法:#   将本系统主脚本放在 Main 的上面 and 【KDS改】原内部数据 的下面.#   然后将此补丁放在本系统主脚本的下面即可.#======================================================================module RPGclass Sprite < ::Sprite    def update_loop_animation      if @xiaoshi2 != nil and @xiaoshi2 > 0      @xiaoshi2 -= 1      for animation in @hzhj_loop_animations          frame_index = @hzhj_loop_index          cell_data = animation.frames.cell_data          position = animation.position          sprites = @hzhj_loop_sprites          animation_set_sprites(sprites, cell_data, position, true)      end      else      for animation in @hzhj_loop_animations          frame_index = @hzhj_loop_index          cell_data = animation.frames.cell_data          position = animation.position          sprites = @hzhj_loop_sprites          animation_set_sprites(sprites, cell_data, position)          for timing in animation.timings            if timing.frame == frame_index            animation_process_timing(timing, true)            end          end      end      end    endendend#======================================================================# 脚本来自 www.66rpg.com 使用或转载请保留此信息# 功能:多状态动画同时显示 梦幻群侠传系统专用补丁# 版本:2.01# 作者:后知后觉 2011-3-7#======================================================================复制代码
             本帖来自P1论坛作者后知后觉,因Project1站服务器在国外有时候访问缓慢不方便作者交流学习,经联系P1站长fux2同意署名转载一起分享游戏制作经验,共同为国内独立游戏作者共同创造良好交流环境,原文地址:https://rpg.blue/forum.php?mod=viewthread&tid=126144若有侵权,发帖作者可联系底部站长QQ在线咨询功能删除,谢谢。
页: [1]
查看完整版本: 同时显示多个状态动画 v2.01 (2011-03-02更新)