Project1

标题: 求VX版的“事件同时显示多个动画”脚本 [打印本页]

作者: 好记的名字    时间: 2011-8-27 13:45
标题: 求VX版的“事件同时显示多个动画”脚本
本帖最后由 Kimu 于 2011-8-27 14:02 编辑

本来一个事件显示动画没显示完再显示另一个动画 前一个动画就会中断 XP有可以叠加多个动画的脚本 求个VX版的
这是XP版的
  1. #--------------------------------------------------
  2. # 此脚本来自[url]www.66RPG.com[/url],使用请保留此信息
  3. #--------------------------------------------------
  4. module RPG
  5.   class Sprite < ::Sprite
  6.     def initialize(viewport = nil)
  7.       super(viewport)
  8.       @_whiten_duration = 0
  9.       @_appear_duration = 0
  10.       @_escape_duration = 0
  11.       @_collapse_duration = 0
  12.       @_damage_duration = 0
  13.       @_animation_duration = 0
  14.       @_blink = false
  15.       @_animation = []
  16.     end
  17.     def animation(animation, hit)
  18.       return if animation == nil
  19.       num = @_animation.size
  20.       @_animation.push([animation, hit, animation.frame_max, []])
  21.       bitmap = RPG::Cache.animation(animation.animation_name,
  22.                                     animation.animation_hue)
  23.       if @@_reference_count.include?(bitmap)
  24.         @@_reference_count[bitmap] += 1
  25.       else
  26.         @@_reference_count[bitmap] = 1
  27.       end
  28.       if @_animation[num][0] != 3 or not @@_animations.include?(animation)
  29.         for i in 0..15
  30.           sprite = ::Sprite.new
  31.           sprite.bitmap = bitmap
  32.           sprite.visible = false
  33.           @_animation[num][3].push(sprite)
  34.         end
  35.         unless @@_animations.include?(animation)
  36.           @@_animations.push(animation)
  37.         end
  38.       end
  39.       update_animation(@_animation[num])
  40.     end
  41.     def loop_animation(animation)
  42.       return if animation == @_loop_animation
  43.       dispose_loop_animation
  44.       @_loop_animation = animation
  45.       return if @_loop_animation == nil
  46.       @_loop_animation_index = 0
  47.       animation_name = @_loop_animation.animation_name
  48.       animation_hue = @_loop_animation.animation_hue
  49.       bitmap = RPG::Cache.animation(animation_name, animation_hue)
  50.       if @@_reference_count.include?(bitmap)
  51.         @@_reference_count[bitmap] += 1
  52.       else
  53.         @@_reference_count[bitmap] = 1
  54.       end
  55.       @_loop_animation_sprites = []
  56.       for i in 0..15
  57.         sprite = ::Sprite.new
  58.         sprite.bitmap = bitmap
  59.         sprite.visible = false
  60.         @_loop_animation_sprites.push(sprite)
  61.       end
  62.       # update_loop_animation
  63.     end
  64.     def dispose_animation
  65.       for anime in @_animation.reverse
  66.         sprite = anime[3][0]
  67.         if sprite != nil
  68.           @@_reference_count[sprite.bitmap] -= 1
  69.           if @@_reference_count[sprite.bitmap] == 0
  70.             sprite.bitmap.dispose
  71.           end
  72.         end
  73.         for sprite in anime[3]
  74.           sprite.dispose
  75.         end
  76.         @_animation.delete(anime)
  77.       end
  78.     end
  79.    
  80.     def update
  81.       super
  82.       if @_whiten_duration > 0
  83.         @_whiten_duration -= 1
  84.         self.color.alpha = 128 - (16 - @_whiten_duration) * 10
  85.       end
  86.       if @_appear_duration > 0
  87.         @_appear_duration -= 1
  88.         self.opacity = (16 - @_appear_duration) * 16
  89.       end
  90.       if @_escape_duration > 0
  91.         @_escape_duration -= 1
  92.         self.opacity = 256 - (32 - @_escape_duration) * 10
  93.       end
  94.       if @_collapse_duration > 0
  95.         @_collapse_duration -= 1
  96.         self.opacity = 256 - (48 - @_collapse_duration) * 6
  97.       end
  98.       if @_damage_duration > 0
  99.         @_damage_duration -= 1
  100.         case @_damage_duration
  101.         when 38..39
  102.           @_damage_sprite.y -= 4
  103.         when 36..37
  104.           @_damage_sprite.y -= 2
  105.         when 34..35
  106.           @_damage_sprite.y += 2
  107.         when 28..33
  108.           @_damage_sprite.y += 4
  109.         end
  110.         @_damage_sprite.opacity = 256 - (12 - @_damage_duration) * 32
  111.         if @_damage_duration == 0
  112.           dispose_damage
  113.         end
  114.       end
  115.       for anime in @_animation
  116.         if (Graphics.frame_count % 2 == 0)
  117.           anime[2] -= 1
  118.           update_animation(anime)
  119.         end
  120.       end
  121.       if @_loop_animation != nil and (Graphics.frame_count % 2 == 0)
  122.         update_loop_animation
  123.         @_loop_animation_index += 1
  124.         @_loop_animation_index %= @_loop_animation.frame_max
  125.       end
  126.       if @_blink
  127.         @_blink_count = (@_blink_count + 1) % 32
  128.         if @_blink_count < 16
  129.           alpha = (16 - @_blink_count) * 6
  130.         else
  131.           alpha = (@_blink_count - 16) * 6
  132.         end
  133.         self.color.set(255, 255, 255, alpha)
  134.       end
  135.       @@_animations.clear
  136.     end

  137.     def update_animation(anime)
  138.       if anime[2] > 0
  139.         frame_index = anime[0].frame_max - anime[2]
  140.         cell_data = anime[0].frames[frame_index].cell_data
  141.         position = anime[0].position
  142.         animation_set_sprites(anime[3], cell_data, position)
  143.         for timing in anime[0].timings
  144.           if timing.frame == frame_index
  145.             animation_process_timing(timing, anime[1])
  146.           end
  147.         end
  148.       else
  149.         @@_reference_count[anime[3][0].bitmap] -= 1
  150.         if @@_reference_count[anime[3][0].bitmap] == 0
  151.             anime[3][0].bitmap.dispose
  152.         end
  153.         for sprite in anime[3]
  154.           sprite.dispose
  155.         end
  156.         @_animation.delete(anime)
  157.       end
  158.     end
  159.     def animation_set_sprites(sprites, cell_data, position)
  160.       for i in 0..15
  161.         sprite = sprites[i]
  162.         pattern = cell_data[i, 0]
  163.         if sprite == nil or pattern == nil or pattern == -1
  164.           sprite.visible = false if sprite != nil
  165.           next
  166.         end
  167.         sprite.visible = true
  168.         sprite.src_rect.set(pattern % 5 * 192, pattern / 5 * 192, 192, 192)
  169.         if position == 3
  170.           if self.viewport != nil
  171.             sprite.x = self.viewport.rect.width / 2
  172.             if $game_temp.in_battle and self.battler.is_a?(Game_Enemy)
  173.               sprite.y = self.viewport.rect.height - 320
  174.             else
  175.               sprite.y = self.viewport.rect.height - 160
  176.             end
  177.           else
  178.             sprite.x = 320
  179.             sprite.y = 240
  180.           end
  181.         else
  182.           sprite.x = self.x + self.viewport.rect.x -
  183.                       self.ox + self.src_rect.width / 2
  184.           if $game_temp.in_battle and self.battler.is_a?(Game_Enemy)
  185.             sprite.y = self.y - self.oy * self.zoom_y / 2 +
  186.                         self.viewport.rect.y
  187.             if position == 0
  188.               sprite.y -= self.src_rect.height * self.zoom_y / 4
  189.             elsif position == 2
  190.               sprite.y += self.src_rect.height * self.zoom_y / 4
  191.             end
  192.           else
  193.             sprite.y = self.y + self.viewport.rect.y -
  194.                         self.oy + self.src_rect.height / 2
  195.             sprite.y -= self.src_rect.height / 4 if position == 0
  196.             sprite.y += self.src_rect.height / 4 if position == 2
  197.           end
  198.         end
  199.         sprite.x += cell_data[i, 1]
  200.         sprite.y += cell_data[i, 2]
  201.         sprite.z = 2000
  202.         sprite.ox = 96
  203.         sprite.oy = 96
  204.         sprite.zoom_x = cell_data[i, 3] / 100.0
  205.         sprite.zoom_y = cell_data[i, 3] / 100.0
  206.         if position != 3
  207.           sprite.zoom_x *= self.zoom_x
  208.           sprite.zoom_y *= self.zoom_y
  209.         end
  210.         sprite.angle = cell_data[i, 4]
  211.         sprite.mirror = (cell_data[i, 5] == 1)
  212.         sprite.opacity = cell_data[i, 6] * self.opacity / 255.0
  213.         sprite.blend_type = cell_data[i, 7]
  214.       end
  215.     end
  216.   end
  217. end
复制代码
dsu_plus_rewardpost_czw


好记的名字于2011-8-27 14:48补充以下内容:
已解决。。貌似是这个
  1. #==============================================================================
  2. # 本脚本来自www.66RPG.com,使用和转载请保留此信息
  3. #==============================================================================

  4. #==============================================================================
  5. # ■ Sprite_Base
  6. #------------------------------------------------------------------------------
  7. #  处理动画显示追加活动块的类变量。
  8. #==============================================================================

  9. class Sprite_Base < Sprite
  10.   #--------------------------------------------------------------------------
  11.   # ● 类变量
  12.   # @@animations 用来记录动画正在播放,防止同一时间多次在同位置播放全屏动画
  13.   # @@_reference_count 用来记录哪些素材正在被使用
  14.   #--------------------------------------------------------------------------
  15.   @@animations = []
  16.   @@_reference_count = {}
  17.   #--------------------------------------------------------------------------
  18.   # ● done 初始化对像
  19.   #     viewport : 视口
  20.   #--------------------------------------------------------------------------
  21.   def initialize(viewport = nil)
  22.     super(viewport)
  23.     @use_sprite = true          # 活动块使用标记
  24.     @animation_duration = 0     # 动画剩余时间
  25.     # 基本结构:animation, mirror, length, sprites, ox, oy ,[bitmap1, bitmap2]
  26.     @animation_collection = []
  27.   end
  28.   #--------------------------------------------------------------------------
  29.   # ● done 释放
  30.   #--------------------------------------------------------------------------
  31.   def dispose
  32.     super
  33.     return if @animation_collection == nil
  34.     for ani in @animation_collection
  35.       dispose_animation(ani)
  36.     end
  37.   end
  38.   #--------------------------------------------------------------------------
  39.   # ● done 刷新画面
  40.   #--------------------------------------------------------------------------
  41.   def update
  42.     super
  43.     if @animation_collection != nil
  44.       @animation_duration -= 1
  45.       for ani in @animation_collection
  46.         ani[2] -= 1
  47.         if ani[2] % 4 == 0
  48.           update_animation(ani)
  49.         end
  50.       end
  51.     end
  52.     @@animations.clear
  53.   end
  54.   #--------------------------------------------------------------------------
  55.   # ● done 动画显示中判定
  56.   #--------------------------------------------------------------------------
  57.   def animation?
  58.     return @animation_collection != nil
  59.   end
  60.   #--------------------------------------------------------------------------
  61.   # ● done 开始动画
  62.   #--------------------------------------------------------------------------
  63.   def start_animation(animation, mirror = false)
  64.     @animation = animation
  65.     return if @animation == nil
  66.     @animation_mirror = mirror
  67.     animation_length = @animation.frame_max * 4 + 1
  68.     @animation_duration += animation_length
  69.     animbitmap = load_animation_bitmap
  70.     @animation_sprites = []
  71.     if @animation.position != 3 or not @@animations.include?(animation)
  72.       if @use_sprite
  73.         for i in 0..15
  74.           sprite = ::Sprite.new(viewport)
  75.           sprite.visible = false
  76.           @animation_sprites.push(sprite)
  77.         end
  78.         unless @@animations.include?(animation)
  79.           @@animations.push(animation)
  80.         end
  81.       end
  82.     end
  83.     if @animation.position == 3
  84.       if viewport == nil
  85.         @animation_ox = 544 / 2
  86.         @animation_oy = 416 / 2
  87.       else
  88.         @animation_ox = viewport.rect.width / 2
  89.         @animation_oy = viewport.rect.height / 2
  90.       end
  91.     else
  92.       @animation_ox = x - ox + width / 2
  93.       @animation_oy = y - oy + height / 2
  94.       if @animation.position == 0
  95.         @animation_oy -= height / 2
  96.       elsif @animation.position == 2
  97.         @animation_oy += height / 2
  98.       end
  99.     end
  100.     @animation_collection.push([@animation, @animation_mirror, animation_length,
  101.                                 @animation_sprites, @animation_ox, @animation_oy,
  102.                                 animbitmap])
  103.   end
  104.   #--------------------------------------------------------------------------
  105.   # ● done 读取动画的类变量
  106.   #--------------------------------------------------------------------------
  107.   def load_animation_bitmap
  108.     animation1_name = @animation.animation1_name
  109.     animation1_hue = @animation.animation1_hue
  110.     animation2_name = @animation.animation2_name
  111.     animation2_hue = @animation.animation2_hue
  112.     @animation_bitmap1 = Cache.animation(animation1_name, animation1_hue)
  113.     @animation_bitmap2 = Cache.animation(animation2_name, animation2_hue)
  114.     if @@_reference_count.include?(@animation_bitmap1)
  115.       @@_reference_count[@animation_bitmap1] += 1
  116.     else
  117.       @@_reference_count[@animation_bitmap1] = 1
  118.     end
  119.     if @@_reference_count.include?(@animation_bitmap2)
  120.       @@_reference_count[@animation_bitmap2] += 1
  121.     else
  122.       @@_reference_count[@animation_bitmap2] = 1
  123.     end
  124.     Graphics.frame_reset
  125.     return [@animation_bitmap1, @animation_bitmap2]
  126.   end
  127.   #--------------------------------------------------------------------------
  128.   # ● done 释放动画
  129.   #--------------------------------------------------------------------------
  130.   def dispose_animation(ani)
  131.     if ani[6][0] != nil
  132.       @@_reference_count[ani[6][0]] -= 1
  133.       if @@_reference_count[ani[6][0]] == 0
  134.         ani[6][0].dispose
  135.       end
  136.     end
  137.     if ani[6][1] != nil
  138.       @@_reference_count[ani[6][1]] -= 1
  139.       if @@_reference_count[ani[6][1]] == 0
  140.         ani[6][1].dispose
  141.       end
  142.     end
  143.     if ani[3] != nil
  144.       for sprite in ani[3]
  145.         sprite.dispose
  146.       end
  147.       @animation_sprites = nil
  148.       @animation = nil
  149.     end
  150.   end
  151.   #--------------------------------------------------------------------------
  152.   # ● done 刷新动画
  153.   #--------------------------------------------------------------------------
  154.   def update_animation(ani)
  155.     if ani[2] > 0
  156.       frame_index = ani[0].frame_max - (ani[2] + 3) / 4
  157.       animation_set_sprites(ani[0].frames[frame_index], ani)
  158.       for timing in ani[0].timings
  159.         if timing.frame == frame_index
  160.           animation_process_timing(timing)
  161.         end
  162.       end
  163.     else
  164.       dispose_animation(ani)
  165.     end
  166.   end
  167.   #--------------------------------------------------------------------------
  168.   # ● done 设置动画活动块
  169.   #     frame : 帧数据 (RPG::Animation::Frame)
  170.   #--------------------------------------------------------------------------
  171.   def animation_set_sprites(frame, ani)
  172.     cell_data = frame.cell_data
  173.     for i in 0..15
  174.       sprite = ani[3][i]
  175.       next if sprite == nil
  176.       pattern = cell_data[i, 0]
  177.       if pattern == nil or pattern == -1
  178.         sprite.visible = false
  179.         next
  180.       end
  181.       if pattern < 100
  182.         sprite.bitmap = ani[6][0]
  183.       else
  184.         sprite.bitmap = ani[6][1]
  185.       end
  186.       sprite.visible = true
  187.       sprite.src_rect.set(pattern % 5 * 192,
  188.         pattern % 100 / 5 * 192, 192, 192)
  189.       if @animation_mirror
  190.         sprite.x = ani[4] - cell_data[i, 1]
  191.         sprite.y = ani[5] - cell_data[i, 2]
  192.         sprite.angle = (360 - cell_data[i, 4])
  193.         sprite.mirror = (cell_data[i, 5] == 0)
  194.       else
  195.         sprite.x = ani[4] + cell_data[i, 1]
  196.         sprite.y = ani[5] + cell_data[i, 2]
  197.         sprite.angle = cell_data[i, 4]
  198.         sprite.mirror = (cell_data[i, 5] == 1)
  199.       end
  200.       sprite.z = self.z + 300
  201.       sprite.ox = 96
  202.       sprite.oy = 96
  203.       sprite.zoom_x = cell_data[i, 3] / 100.0
  204.       sprite.zoom_y = cell_data[i, 3] / 100.0
  205.       sprite.opacity = cell_data[i, 6] * self.opacity / 255.0
  206.       sprite.blend_type = cell_data[i, 7]
  207.     end
  208.   end
  209.   #--------------------------------------------------------------------------
  210.   # ●  done SE 与闪烁的时机处理
  211.   #     timing : Timing数据 (RPG::Animation::Timing)
  212.   #--------------------------------------------------------------------------
  213.   def animation_process_timing(timing)
  214.     timing.se.play
  215.     case timing.flash_scope
  216.     when 1
  217.       self.flash(timing.flash_color, timing.flash_duration * 4)
  218.     when 2
  219.       if viewport != nil
  220.         viewport.flash(timing.flash_color, timing.flash_duration * 4)
  221.       end
  222.     when 3
  223.       self.flash(nil, timing.flash_duration * 4)
  224.     end
  225.   end
  226. end

  227. #==============================================================================
  228. # 本脚本来自www.66RPG.com,使用和转载请保留此信息
  229. #==============================================================================

复制代码


好记的名字于2011-8-27 14:49补充以下内容:
已解决。。。。。。。


好记的名字于2011-8-27 14:52补充以下内容:
已解决




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1