这个主要原因是 RPG::Sprite 中同时只会判断一个伤害动画的持续时间,而且当一个新的伤害显示时,旧的就会立刻被释放~解决方法是把伤害的精灵及其持续时间用一个容器组织起来,这样就可以同时存在多个伤害动画了,这个方法和以前的彩虹神剑所采用的方法基本相同…… 注意红色部分是修改过的代码,灰色的是 RPG::Sprite 原本的内容: module RPG class Sprite < ::Sprite def initialize(viewport = nil) super(viewport) @_whiten_duration = 0 @_appear_duration = 0 @_escape_duration = 0 @_collapse_duration = 0 #@_damage_duration = 0 @_damage_sprites = {} @_animation_duration = 0 @_blink = false end def dispose #dispose_damage @_damage_sprites.each_key { |key| dispose_damage(key) } dispose_animation dispose_loop_animation super end def damage(value, critical) #dispose_damage if value.is_a?(Numeric) damage_string = value.abs.to_s else damage_string = value.to_s end bitmap = Bitmap.new(160, 48) bitmap.font.name = "Arial Black" bitmap.font.size = 32 bitmap.font.color.set(0, 0, 0) bitmap.draw_text(-1, 12-1, 160, 36, damage_string, 1) bitmap.draw_text(+1, 12-1, 160, 36, damage_string, 1) bitmap.draw_text(-1, 12+1, 160, 36, damage_string, 1) bitmap.draw_text(+1, 12+1, 160, 36, damage_string, 1) if value.is_a?(Numeric) and value < 0 bitmap.font.color.set(176, 255, 144) else bitmap.font.color.set(255, 255, 255) end bitmap.draw_text(0, 12, 160, 36, damage_string, 1) if critical bitmap.font.size = 20 bitmap.font.color.set(0, 0, 0) bitmap.draw_text(-1, -1, 160, 20, "CRITICAL", 1) bitmap.draw_text(+1, -1, 160, 20, "CRITICAL", 1) bitmap.draw_text(-1, +1, 160, 20, "CRITICAL", 1) bitmap.draw_text(+1, +1, 160, 20, "CRITICAL", 1) bitmap.font.color.set(255, 255, 255) bitmap.draw_text(0, 0, 160, 20, "CRITICAL", 1) end #@_damage_sprites = ::Sprite.new(self.viewport) #@_damage_sprite.bitmap = bitmap #@_damage_sprite.ox = 80 #@_damage_sprite.oy = 20 #@_damage_sprite.x = self.x #@_damage_sprite.y = self.y - self.oy / 2 #@_damage_sprite.z = 3000 #@_damage_duration = 40 _damage_sprite = ::Sprite.new(self.viewport) _damage_sprite.bitmap = bitmap _damage_sprite.ox = 80 _damage_sprite.oy = 20 _damage_sprite.x = self.x _damage_sprite.y = self.y - self.oy / 2 _damage_sprite.z = 3000 @_damage_sprites[_damage_sprite] = 40 end def dispose_damage(_damage_sprite) #if @_damage_sprite != nil # @_damage_sprite.bitmap.dispose # @_damage_sprite.dispose # @_damage_sprite = nil # @_damage_duration = 0 #end if @_damage_sprites[_damage_sprite] _damage_sprite.bitmap.dispose _damage_sprite.dispose @_damage_sprites.delete(_damage_sprite) _damage_sprite = nil end end def effect? @_whiten_duration > 0 or @_appear_duration > 0 or @_escape_duration > 0 or @_collapse_duration > 0 or #@_damage_duration > 0 or not @_damage_sprites.empty? or @_animation_duration > 0 end def update super if @_whiten_duration > 0 @_whiten_duration -= 1 self.color.alpha = 128 - (16 - @_whiten_duration) * 10 end if @_appear_duration > 0 @_appear_duration -= 1 self.opacity = (16 - @_appear_duration) * 16 end if @_escape_duration > 0 @_escape_duration -= 1 self.opacity = 256 - (32 - @_escape_duration) * 10 end if @_collapse_duration > 0 @_collapse_duration -= 1 self.opacity = 256 - (48 - @_collapse_duration) * 6 end #if @_damage_duration > 0 # @_damage_duration -= 1 # case @_damage_duration # when 38..39 # @_damage_sprite.y -= 4 # when 36..37 # @_damage_sprite.y -= 2 # when 34..35 # @_damage_sprite.y += 2 # when 28..33 # @_damage_sprite.y += 4 # end # @_damage_sprite.opacity = 256 - (12 - @_damage_duration) * 32 # if @_damage_duration == 0 # dispose_damage # end #end @_damage_sprites.each_pair { |key, val| if val > 0 @_damage_sprites[key] -= 1 case val - 1 when 38..39 key.y -= 4 when 36..37 key.y -= 2 when 34..35 key.y += 2 when 28..33 key.y += 4 end key.opacity = 256 - (12 - val) * 32 if val - 1 == 0 dispose_damage(key) end end } if @_animation != nil and (Graphics.frame_count % 2 == 0) @_animation_duration -= 1 update_animation end if @_loop_animation != nil and (Graphics.frame_count % 2 == 0) update_loop_animation @_loop_animation_index += 1 @_loop_animation_index %= @_loop_animation.frame_max end if @_blink @_blink_count = (@_blink_count + 1) % 32 if @_blink_count < 16 alpha = (16 - @_blink_count) * 6 else alpha = (@_blink_count - 16) * 6 end self.color.set(255, 255, 255, alpha) end @@_animations.clear end end end |
站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作
GMT+8, 2025-7-22 03:28
Powered by Discuz! X3.1
© 2001-2013 Comsenz Inc.