查看: 52|回复: 0

[转载发布] 同时显示多个状态动画 v2.01 (2011-03-02更新)

[复制链接]
  • TA的每日心情
    开心
    2024-5-10 09:55
  • 签到天数: 37 天

    连续签到: 3 天

    [LV.5]常住居民I

    2028

    主题

    32

    回帖

    7260

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    VIP
    0
    卡币
    5184
    OK点
    16
    积分
    7260
    发表于 同元一千年八月三日(秋) | 显示全部楼层 |阅读模式
    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
    重新使用新的制作思路完成这一效果.老版本的删掉了.

    脚本如下:
    1. #======================================================================# 脚本来自www.66rpg.com,使用或转载请保留此信息# 功能:多状态动画同时显示# 版本:2.01# 作者:后知后觉 2011-3-2# 使用方法:插入Main前即可# 冲突可能:只要在你的脚本编辑器内没有对 RPG::Sprite 或 Sprite_Battler 类#           以下三个方法做出过别的定义 则就有较大的兼容性#           loop_animation#           dispose_loop_animation#           update_loop_animation#======================================================================module RPG  class 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[animation] = 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[bitmap] += 1      else        @@_reference_count[bitmap] = 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[animation] = 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[0]          if sprite != nil            @@_reference_count[sprite.bitmap] -= 1            if @@_reference_count[sprite.bitmap] == 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[animation] += 1          @hzhj_loop_index[animation] %= animation.frame_max        end      end    end    def update_loop_animation      for animation in @hzhj_loop_animations        frame_index = @hzhj_loop_index[animation]        cell_data = animation.frames[frame_index].cell_data        position = animation.position        sprites = @hzhj_loop_sprites[animation]        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[animation][i].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[animation][i].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[i].nil?          if $data_states[i].animation_id == animation.id            return          end        end      end      sprites = @hzhj_loop_sprites[animation]      sprite = sprites[0]      if sprite != nil        @@_reference_count[sprite.bitmap] -= 1        if @@_reference_count[sprite.bitmap] == 0          sprite.bitmap.dispose        end      end      for sprite in sprites        sprite.dispose      end      @hzhj_loop_index[animation] = 0      @hzhj_loop_sprites[animation] = nil      @hzhj_loop_animations.delete(animation)    end  endend#==============================================================================# ■ Game_Battler#==============================================================================class Game_Battler  if @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 = true  end  #--------------------------------------------------------------------------  # ● 定义实例变量  #--------------------------------------------------------------------------  attr_reader   :hzhj_add_state_id  attr_reader   :hzhj_remove_state_id  #--------------------------------------------------------------------------  # ● 初始化对像  #--------------------------------------------------------------------------  def initialize    @hzhj_add_state_id = []    @hzhj_remove_state_id = []    hzhj_old_ini_gb_state_animation  end  #--------------------------------------------------------------------------  # ● 附加状态  #--------------------------------------------------------------------------  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[i].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[i].animation_id > 0        if not @hzhj_remove_state_id.include?(i)          @hzhj_remove_state_id.push(i)        end      end    end  end  #--------------------------------------------------------------------------  # ● 解除状态  #--------------------------------------------------------------------------  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[i].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[i].animation_id > 0        if not @hzhj_remove_state_id.include?(i)          @hzhj_remove_state_id.push(i)        end      end    end  endend#==============================================================================# ■ Sprite_Battler#==============================================================================class Sprite_Battler < RPG::Sprite  if @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 = true  end  #--------------------------------------------------------------------------  # ● 初始化  #--------------------------------------------------------------------------  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[i].nil?        next if $data_states[i].animation_id == 0        next if $data_animations[$data_states[i].animation_id].nil?        @battler.hzhj_add_state_id.push(i)      end    end  end  #--------------------------------------------------------------------------  # ● 刷新  #--------------------------------------------------------------------------  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[i].animation_id              animation = $data_animations[animation_id]              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[i].animation_id              animation = $data_animations[animation_id]              stop_loop_animation(animation) if not animation.nil?            end          end          @battler.hzhj_remove_state_id.clear        end      end    end  endend#======================================================================# 脚本来自 www.66rpg.com 使用或转载请保留此信息# 功能:多状态动画同时显示# 版本:2.01# 作者:后知后觉 2011-3-2# 使用方法:插入Main前即可#======================================================================复制代码
    复制代码
    以下内容是给梦幻群侠传系统加的本脚本的一个补丁:
    其实就是重新定义了一下 update_loop_animation
    使用方法:
    将本系统主脚本放在 Main 的上面 and 【KDS改】原内部数据 的下面.
    然后将此补丁放在本系统主脚本的下面即可.
    1. #======================================================================# 脚本来自www.66rpg.com,使用或转载请保留此信息# 功能:多状态动画同时显示 梦幻群侠传系统专用补丁# 版本:2.01# 作者:后知后觉 2011-3-7# 使用方法:#     将本系统主脚本放在 Main 的上面 and 【KDS改】原内部数据 的下面.#     然后将此补丁放在本系统主脚本的下面即可.#======================================================================module RPG  class 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[animation]          cell_data = animation.frames[frame_index].cell_data          position = animation.position          sprites = @hzhj_loop_sprites[animation]          animation_set_sprites(sprites, cell_data, position, true)        end      else        for animation in @hzhj_loop_animations          frame_index = @hzhj_loop_index[animation]          cell_data = animation.frames[frame_index].cell_data          position = animation.position          sprites = @hzhj_loop_sprites[animation]          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    end  endend#======================================================================# 脚本来自 www.66rpg.com 使用或转载请保留此信息# 功能:多状态动画同时显示 梦幻群侠传系统专用补丁# 版本:2.01# 作者:后知后觉 2011-3-7#======================================================================复制代码
    复制代码
                 本帖来自P1论坛作者后知后觉,因Project1站服务器在国外有时候访问缓慢不方便作者交流学习,经联系P1站长fux2同意署名转载一起分享游戏制作经验,共同为国内独立游戏作者共同创造良好交流环境,原文地址:https://rpg.blue/forum.php?mod=viewthread&tid=126144  若有侵权,发帖作者可联系底部站长QQ在线咨询功能删除,谢谢。
    天天去同能,天天有童年!
    回复 论坛版权

    使用道具 举报

    ahome_bigavatar:guest
    ahome_bigavatar:welcomelogin
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|手机版|小黑屋|同能RPG制作大师 ( 沪ICP备12027754号-3 )

    GMT+8, 2024-5-21 00:53 , Processed in 0.047581 second(s), 43 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.

    快速回复 返回顶部 返回列表