同时显示多个状态动画 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]