设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 5688|回复: 18
打印 上一主题 下一主题

VX:多动画叠加效果 v1.0

 关闭 [复制链接]

Lv1.梦旅人

66RPG站长

梦石
0
星屑
54
在线时间
615 小时
注册时间
2005-10-10
帖子
5734

RMVX自由创作大赛亚军第2届短篇游戏比赛亚军第5届短篇游戏比赛冠军

跳转到指定楼层
1
发表于 2008-1-12 07:53:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
VX和XP一样,每个精灵只能同时播放一个动画,经过以下脚本改写实现每个精灵可以同时播放多个动画。原理就是新建一个animation_collection的数组做池,每次刷新从池里面检查状态。

效果图:(在同时播放6个动画)


脚本:
  1. #==============================================================================
  2. # ■ Sprite_Base
  3. #------------------------------------------------------------------------------
  4. #  处理动画显示追加活动块的类变量。
  5. #==============================================================================

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



Lv1.梦旅人

66RPG站长

梦石
0
星屑
54
在线时间
615 小时
注册时间
2005-10-10
帖子
5734

RMVX自由创作大赛亚军第2届短篇游戏比赛亚军第5届短篇游戏比赛冠军

2
 楼主| 发表于 2008-1-12 07:53:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
VX和XP一样,每个精灵只能同时播放一个动画,经过以下脚本改写实现每个精灵可以同时播放多个动画。原理就是新建一个animation_collection的数组做池,每次刷新从池里面检查状态。

效果图:(在同时播放6个动画)


脚本:
  1. #==============================================================================
  2. # ■ Sprite_Base
  3. #------------------------------------------------------------------------------
  4. #  处理动画显示追加活动块的类变量。
  5. #==============================================================================

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



头像被屏蔽

Lv1.梦旅人 (禁止发言)

坏人/。

梦石
0
星屑
50
在线时间
0 小时
注册时间
2008-1-12
帖子
396
3
发表于 2008-1-12 18:48:49 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
4 小时
注册时间
2006-5-27
帖子
458
4
发表于 2008-1-12 19:41:15 | 只看该作者
很好很强大 覆盖原脚本是吧?
回复 支持 反对

使用道具 举报

Lv1.梦旅人

风雪夜不归人

梦石
0
星屑
50
在线时间
276 小时
注册时间
2006-3-7
帖子
6721

贵宾

5
发表于 2008-1-12 22:41:17 | 只看该作者
以下引用叮当于2008-1-12 11:41:15的发言:

很好很强大 覆盖原脚本是吧?


支持!!!!!!!!!
有些人,到了七八月份就会诈尸。
宫斗,是女生永远的爱。
冷门,是本人不变的欲。
作弊,是玩家自由的痛。
练级,是橙光割舍的情。
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
0 小时
注册时间
2007-12-15
帖子
66
6
发表于 2008-1-12 23:10:03 | 只看该作者
看上去不错,希望站长给个工程
回复 支持 反对

使用道具 举报

Lv1.梦旅人

龙皇

梦石
0
星屑
50
在线时间
83 小时
注册时间
2007-8-8
帖子
2956
7
发表于 2008-1-13 06:31:20 | 只看该作者
这XP能拿来用吗?

                签名图来自:無限のファンタジア
                 我的RMXP专题空间--龙使传说
回复 支持 反对

使用道具 举报

Lv1.梦旅人

66RPG站长

梦石
0
星屑
54
在线时间
615 小时
注册时间
2005-10-10
帖子
5734

RMVX自由创作大赛亚军第2届短篇游戏比赛亚军第5届短篇游戏比赛冠军

8
 楼主| 发表于 2008-1-13 08:32:59 | 只看该作者
以下引用TERENCE于2008-1-12 22:31:20的发言:

这XP能拿来用吗?


不能。

以下引用蛋糕于2008-1-12 22:38:45的发言:

应该是通的……


那用吧…………………………{/gg}
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2008-1-14
帖子
17
9
发表于 2008-1-14 00:16:28 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

Lv1.梦旅人

66RPG站长

梦石
0
星屑
54
在线时间
615 小时
注册时间
2005-10-10
帖子
5734

RMVX自由创作大赛亚军第2届短篇游戏比赛亚军第5届短篇游戏比赛冠军

10
 楼主| 发表于 2008-1-14 00:33:44 | 只看该作者
不懂别瞎说,自己学了脚本之后再来这里叫嚣吧。
我倒是想看看这地球是否有任何一个人敢承认这个脚本是他写的而不是柳柳写的。
包括代替别人承认也行。不过如果证实不了,那么对引战的兄弟我也不会沉默不语的。

不是他妈一次两次了,柳柳做的东西就是别人的,6R怎么就这么容易招来一堆心理变态的汉奸呢?
回复 支持 反对

使用道具 举报

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

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2025-1-9 22:03

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表