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

Project1

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

[已经过期] 关于ARPG地图上的动画问题

 关闭 [复制链接]

Lv2.观梦者

梦石
0
星屑
265
在线时间
286 小时
注册时间
2009-11-7
帖子
55

开拓者

跳转到指定楼层
1
发表于 2011-10-1 00:37:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
多动画叠加效果 v1.0和地图动画显示修正 for VX1.02 发生冲突,两个脚本一起多个动画会失效,不管哪个放在前面,我试过合并过但没有成功 求帮忙
  1. #==============================================================================
  2. # ■ [VX_非官方补丁]地图动画显示修正 for VX1.02    —— 原著:诡异の猫
  3. #    针对VX1.02整合:公孙鸿剑[UNIR工作室]
  4. #------------------------------------------------------------------------------
  5. #    注意: 此补丁为VX1.02专用!针对VX1.01的版本请到rpg.blue自己找。
  6. #------------------------------------------------------------------------------
  7. #    补丁内容: 彻底修正地图上播放动画(以画面为中心除外),动画跟随画面移动问题。
  8. #              [Enterbrain对这个问题的修复不彻底]
  9. #==============================================================================

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

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

本版积分规则

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

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

GMT+8, 2025-1-9 01:25

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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