查看: 4014|回复: 6

[原创发布] 同时显示多个动画(可以重叠) 2.17更新

[复制链接]

薄凉看客

梦石
0
星屑
50
在线时间
1269 小时
注册时间
2010-6-20
回帖
1223
发表于 2015-2-17 18:54:55 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有账号?注册会员

×
本帖最后由 恐惧剑刃 于 2015-2-18 09:34 编辑


截图


工程截图
QQ图片20150217224442.png
事件截图(第二张图有点问题,不过影响不大。)
QQ图片20150217224514.png
QQ图片20150217224527.png
地图效果,多动画(可以重叠)
QQ图片20150217224557.png
地图效果,"全屏动画只显示一次"
QQ图片20150217224614.png

战斗(附加了状态)
QQ图片20150217224652.png
QQ图片20150217224711.png
使用还原后
QQ图片20150217224754.png


脚本



基础

[pre lang="ruby"]class RPG::Sprite < ::Sprite
  def initialize(viewport = nil)
    super(viewport)
    @_whiten_duration = 0
    @_appear_duration = 0
    @_escape_duration = 0
    @_collapse_duration = 0
    @_damage_duration = 0
    #@_animation_duration = 0
    @_blink = false
    @_animation = []
    @_animation_hit = []
    @_animation_duration = []
    @_animation_sprites = []
    @_loop_animation = []
    @_loop_animation_sprites = []
    @_loop_animation_index = []
  end
  def animation(animation, hit)
    #dispose_animation
    return if animation == nil
    @_animation << animation
    @_animation_hit << hit
    @_animation_duration << animation.frame_max
    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
    _animation_sprites = []
    if animation.position != 3 or not @@_animations.include?(animation)
      for i in 0..15
        sprite = ::Sprite.new(self.viewport)
        sprite.bitmap = bitmap
        sprite.visible = false
        _animation_sprites.push(sprite)
      end
      @_animation_sprites << _animation_sprites
      unless @@_animations.include?(animation)
        @@_animations.push(animation)
      end
    end
    update_animation
  end
  def loop_animation(animation)
    return if animation == nil or @_loop_animation.include?(animation)
    @_loop_animation << animation
    @_loop_animation_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[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
    @_loop_animation_sprites << _loop_animation_sprites
    update_loop_animation
  end
  def dispose_animation(v=nil)
    for i in 0...@_animation_sprites.size
      sprite = @_animation_sprites[0]
      if sprite != nil
        @@_reference_count[sprite.bitmap] -= 1
        if @@_reference_count[sprite.bitmap] == 0
          sprite.bitmap.dispose
        end
      end
      for sprite in @_animation_sprites
        sprite.dispose
      end
      @_animation_sprites.clear
      #@_animation_sprites.delete_at(i)
      #@_animation.delete_at(i)
      #@_animation_hit.delete_at(i)
      #@_animation_duration.delete_at(i)
    end
    @_animation_sprites.clear
    @_animation.clear
    @_animation_hit.clear
    @_animation_duration.clear
    if v.nil?
      @_animation_sprites = nil
      @_animation = nil
      @_animation_hit = nil
      @_animation_duration = nil
    end
  end
  def dispose_loop_animation(v=nil)
    for i in 0...@_loop_animation_sprites.size
      sprite = @_loop_animation_sprites[0]
      if sprite != nil
        @@_reference_count[sprite.bitmap] -= 1
        if @@_reference_count[sprite.bitmap] == 0
          sprite.bitmap.dispose
        end
      end
      for sprite in @_loop_animation_sprites
        sprite.dispose
      end
      @_loop_animation_sprites.clear
      #@_loop_animation_sprites.delete_at(i)
      #@_loop_animation.delete_at(i)
      #@_loop_animation_index.delete_at(i)
    end
    @_loop_animation_sprites.clear
    @_loop_animation.clear
    @_loop_animation_index.clear
    if v.nil?
      @_loop_animation = nil
      @_loop_animation_sprites = nil
      @_loop_animation_index = 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
    @_animation_duration.size > 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
    if @_animation.size > 0 and (Graphics.frame_count % 2 == 0)
      for i in 0...@_animation_duration.size
        @_animation_duration -= 1
      end
      update_animation
    end
    if @_loop_animation.size > 0 and (Graphics.frame_count % 2 == 0)
      update_loop_animation
      for i in 0...@_loop_animation_index.size
        @_loop_animation_index += 1
        @_loop_animation_index %= @_loop_animation.frame_max
      end
    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
  def update_animation
    for i in 0...@_animation_duration.size
      if @_animation_duration <= 0
        @_animation_duration = nil
        sprite = @_animation_sprites[0]
        if sprite != nil
          @@_reference_count[sprite.bitmap] -= 1
          if @@_reference_count[sprite.bitmap] == 0
            sprite.bitmap.dispose
          end
        end
        for sprite in @_animation_sprites
          sprite.dispose
        end
        @_animation_duration.delete_at(i)
        @_animation_sprites.delete_at(i)
        @_animation.delete_at(i)
        return
      end
      frame_index = @_animation.frame_max - @_animation_duration
      cell_data = @_animation.frames[frame_index].cell_data
      position = @_animation.position
      animation_set_sprites(@_animation_sprites, cell_data, position)
      for timing in @_animation.timings
        if timing.frame == frame_index
          animation_process_timing(timing, @_animation_hit)
        end
      end
    #else
    #  dispose_animation
    end
  end
  def update_loop_animation
    for i in 0...@_loop_animation_index.size
      frame_index = @_loop_animation_index
      cell_data = @_loop_animation.frames[frame_index].cell_data
      position = @_loop_animation.position
      animation_set_sprites(@_loop_animation_sprites, cell_data, position)
      for timing in @_loop_animation.timings
        if timing.frame == frame_index
          animation_process_timing(timing, true)
        end
      end
    end
  end
  def x=(x)
    sx = x - self.x
    if sx != 0
      for each_sprites in 0...@_animation_sprites.size
        for i in 0..15
          @_animation_sprites[each_sprites].x += sx
        end
      end
      for each_sprites in 0...@_loop_animation_sprites.size
        for i in 0..15
          @_loop_animation_sprites[each_sprites].x += sx
        end
      end
    end
    super
  end
  def y=(y)
    sy = y - self.y
    if sy != 0
      for each_sprites in 0...@_animation_sprites.size
        for i in 0..15
          @_animation_sprites[each_sprites].y += sy
        end
      end
      for each_sprites in 0...@_loop_animation_sprites.size
        for i in 0..15
          @_loop_animation_sprites[each_sprites].y += sy
        end
      end
    end
    super
  end
end
[/pre]

附件

[pre lang="ruby"]#==============================================================================
# 应用多动画效果(事件)
#==============================================================================

#==============================================================================
# Scene_Map
#==============================================================================
class Scene_Map
  # 刷新活动块
  def spriteset_update
    @spriteset.update
  end
end
#==============================================================================
# Interpreter
#==============================================================================
class Interpreter
  alias animation_command_207 command_207
  # 刷新活动块
  def command_207
    animation_command_207
    $scene.spriteset_update
    return true
  end
end

#==============================================================================
# 应用多动画效果(战斗)
#==============================================================================

=begin

还有一小段代码,不便直接贴出,清自行修改!
找到 Sprite_Battler
默认 60 行 左右,替换为
    # 动画 ID 与当前的情况有差异的情况下======================================
    if @battler.damage == nil and @battler.ani_update
      dispose_loop_animation(true)
      @battler.ani_update = false
      for i in 0...@battler.state_animation_id.size
        loop_animation($data_animations[@battler.state_animation_id])
      end
    end#======================================================================


=end






#==============================================================================
# Game_Battler
#==============================================================================
class Game_Battler
  def state_animation_id
    id = []
    for i in 0...@states.size
      id = $data_states[@states].animation_id
    end
    return id
  end
  alias ani_add_state add_state
  def add_state(*args)
    ani_add_state(*args)
    @ani_update = true
  end
  alias ani_remove_state remove_state
  def remove_state(*args)
    ani_remove_state(*args)
    @ani_update = true
  end
  attr_accessor :ani_update
end
[/pre]



详见工程


多动画.zip (204.56 KB, 下载次数: 238)

评分

参与人数 6星屑 +590 赞 +1 收起 理由
龙夫三拳tan + 1 精品文章
zhouzhuofan1 + 20 比很久以前的多动画显示脚本要好.
RyanBern + 200 以后提问区有动画的问题果断摔链接.
邪月长啸 + 45 支持恋大
紫英晓狼1130 + 240 精品文章
·雾逝者· + 85 精品文章

查看全部评分

梦石
0
星屑
8026
在线时间
1051 小时
注册时间
2012-4-3
回帖
1270

开拓者

发表于 2015-2-18 03:02:04 来自手机 | 显示全部楼层
这是一个令人期待的技术,我会继续关注你的。
回复

使用道具 举报

梦石
0
星屑
462
在线时间
871 小时
注册时间
2014-5-5
回帖
914
发表于 2015-2-18 19:03:14 | 显示全部楼层
已收藏~恋大的东西都很有意思
回复

使用道具 举报

梦石
0
星屑
50
在线时间
274 小时
注册时间
2014-2-22
回帖
260
发表于 2015-11-6 03:34:54 | 显示全部楼层
BUG:并行处理的话如果播放动画就会直接报错【估计自动执行也会一样?未测试

点评

TIP:报错的那一行改为 $scene.spriteset_update if $scene.is_a?(Scene_Map)  发表于 2021-1-12 17:07
啊...果然丢失了部分效果,还得修  发表于 2015-11-6 03:38
将$scene.spriteset_update注释掉似乎就可以解决问题了  发表于 2015-11-6 03:37
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部