赞 | 2 |
VIP | 143 |
好人卡 | 1 |
积分 | 1 |
经验 | 216792 |
最后登录 | 2019-10-10 |
在线时间 | 24 小时 |
Lv1.梦旅人
- 梦石
- 0
- 星屑
- 61
- 在线时间
- 24 小时
- 注册时间
- 2008-8-5
- 帖子
- 1924
|
这个主要原因是 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 |
|