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

Project1

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

[已经解决] 判断某编号事件的动画是否在播放中与显示多动画的冲突

[复制链接]

Lv1.梦旅人

梦石
0
星屑
57
在线时间
131 小时
注册时间
2008-8-12
帖子
184
跳转到指定楼层
1
发表于 2012-12-24 12:50:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 兔毛鹿 于 2012-12-28 11:17 编辑

以下脚本是用来判断某编号事件的XX动画是否在播放,比如用 if $game_map.events[1].sprite.anima?(29) 来判断1号事件的29号动画是否在播放
但是用了显示多个动画的脚本后这个脚本就失效了,无论动画是否在播放,都判断成为在播放,求这两个脚本并存的方法

RUBY 代码复制
  1. module RPG
  2.   class Sprite < ::Sprite
  3.     def anima?(id = nil)
  4.       (x = (@_loop_animation ||  @_animation)) && (x.id == id || id==nil)
  5.     end
  6.   end
  7. end
  8. class Spriteset_Map
  9.   def initialize
  10.     # 生成显示端口
  11.     @viewport1 = Viewport.new(0, 0, 640, 480)
  12.     @viewport2 = Viewport.new(0, 0, 640, 480)
  13.     @viewport3 = Viewport.new(0, 0, 640, 480)
  14.     @viewport2.z = 200
  15.     @viewport3.z = 5000
  16.     # 生成元件地图
  17.     @tilemap = Tilemap.new(@viewport1)
  18.     @tilemap.tileset = RPG::Cache.tileset($game_map.tileset_name)
  19.     for i in 0..6
  20.       autotile_name = $game_map.autotile_names[i]
  21.       @tilemap.autotiles[i] = RPG::Cache.autotile(autotile_name)
  22.     end
  23.     @tilemap.map_data = $game_map.data
  24.     @tilemap.priorities = $game_map.priorities
  25.     # 生成远景平面
  26.     @panorama = Plane.new(@viewport1)
  27.     @panorama.z = -1000
  28.     # 生成雾平面
  29.     [url=home.php?mod=space&uid=14217]@fog[/url] = Plane.new(@viewport1)
  30.     @fog.z = 3000
  31.     # 生成角色活动块
  32.     @character_sprites = []
  33.     for i in $game_map.events.keys.sort
  34.       sprite = Sprite_Character.new(@viewport1, $game_map.events[i])
  35.       sprite.character.sprite = sprite
  36.       @character_sprites.push(sprite)
  37.     end
  38.     @character_sprites.push(Sprite_Character.new(@viewport1, $game_player))
  39.     # 生成天气
  40.     @weather = RPG::Weather.new(@viewport1)
  41.     # 生成图片
  42.     @picture_sprites = []
  43.     for i in 1..50
  44.       @picture_sprites.push(Sprite_Picture.new(@viewport2,
  45.       $game_screen.pictures[i]))
  46.     end
  47.     # 生成计时器块
  48.     @timer_sprite = Sprite_Timer.new
  49.     # 刷新画面
  50.     update
  51.   end
  52.   def dispose
  53.     # 释放元件地图
  54.     @tilemap.tileset.dispose
  55.     for i in 0..6
  56.       @tilemap.autotiles[i].dispose
  57.     end
  58.     @tilemap.dispose
  59.     # 释放远景平面
  60.     @panorama.dispose
  61.     # 释放雾平面
  62.     @fog.dispose
  63.     # 释放角色活动块
  64.     for sprite in @character_sprites
  65.       sprite.character.sprite = nil
  66.       sprite.dispose
  67.     end
  68.     # 释放天候
  69.     @weather.dispose
  70.     # 释放图片
  71.     for sprite in @picture_sprites
  72.       sprite.dispose
  73.     end
  74.     # 释放计时器块
  75.     @timer_sprite.dispose
  76.     # 释放显示端口
  77.     @viewport1.dispose
  78.     @viewport2.dispose
  79.     @viewport3.dispose
  80.   end
  81. end
  82. class Game_Character
  83.   attr_accessor:sprite
  84. end

Tomorrow

Lv1.梦旅人

梦石
0
星屑
57
在线时间
131 小时
注册时间
2008-8-12
帖子
184
2
 楼主| 发表于 2012-12-24 12:57:45 | 只看该作者
本帖最后由 兔毛鹿 于 2012-12-24 13:08 编辑

以下是同一事件显示多动画的脚本

地址:
http://www.66rpg.com/articles/3297
  1. module RPG
  2.   class Sprite < ::Sprite
  3.     def initialize(viewport = nil)
  4.       super(viewport)
  5.       @_whiten_duration = 0
  6.       @_appear_duration = 0
  7.       @_escape_duration = 0
  8.       @_collapse_duration = 0
  9.       @_damage_duration = 0
  10.       @_animation_duration = 0
  11.       @_blink = false
  12.       @_animation = []
  13.     end
  14.     def animation(animation, hit)
  15.       return if animation == nil
  16.       num = @_animation.size
  17.       @_animation.push([animation, hit, animation.frame_max, []])
  18.       bitmap = RPG::Cache.animation(animation.animation_name,
  19.                                     animation.animation_hue)
  20.       if @@_reference_count.include?(bitmap)
  21.         @@_reference_count[bitmap] += 1
  22.       else
  23.         @@_reference_count[bitmap] = 1
  24.       end
  25.       if @_animation[num][0] != 3 or not @@_animations.include?(animation)
  26.         for i in 0..15
  27.           sprite = ::Sprite.new
  28.           sprite.bitmap = bitmap
  29.           sprite.visible = false
  30.           @_animation[num][3].push(sprite)
  31.         end
  32.         unless @@_animations.include?(animation)
  33.           @@_animations.push(animation)
  34.         end
  35.       end
  36.       update_animation(@_animation[num])
  37.     end
  38.     def loop_animation(animation)
  39.       return if animation == @_loop_animation
  40.       dispose_loop_animation
  41.       @_loop_animation = animation
  42.       return if @_loop_animation == nil
  43.       @_loop_animation_index = 0
  44.       animation_name = @_loop_animation.animation_name
  45.       animation_hue = @_loop_animation.animation_hue
  46.       bitmap = RPG::Cache.animation(animation_name, animation_hue)
  47.       if @@_reference_count.include?(bitmap)
  48.         @@_reference_count[bitmap] += 1
  49.       else
  50.         @@_reference_count[bitmap] = 1
  51.       end
  52.       @_loop_animation_sprites = []
  53.       for i in 0..15
  54.         sprite = ::Sprite.new
  55.         sprite.bitmap = bitmap
  56.         sprite.visible = false
  57.         @_loop_animation_sprites.push(sprite)
  58.       end
  59.       # update_loop_animation
  60.     end
  61.     def dispose_animation
  62.       for anime in @_animation.reverse
  63.         sprite = anime[3][0]
  64.         if sprite != nil
  65.           @@_reference_count[sprite.bitmap] -= 1
  66.           if @@_reference_count[sprite.bitmap] == 0
  67.             sprite.bitmap.dispose
  68.           end
  69.         end
  70.         for sprite in anime[3]
  71.           sprite.dispose
  72.         end
  73.         @_animation.delete(anime)
  74.       end
  75.     end
  76.      
  77.     def update
  78.       super
  79.       if @_whiten_duration > 0
  80.         @_whiten_duration -= 1
  81.         self.color.alpha = 128 - (16 - @_whiten_duration) * 10
  82.       end
  83.       if @_appear_duration > 0
  84.         @_appear_duration -= 1
  85.         self.opacity = (16 - @_appear_duration) * 16
  86.       end
  87.       if @_escape_duration > 0
  88.         @_escape_duration -= 1
  89.         self.opacity = 256 - (32 - @_escape_duration) * 10
  90.       end
  91.       if @_collapse_duration > 0
  92.         @_collapse_duration -= 1
  93.         self.opacity = 256 - (48 - @_collapse_duration) * 6
  94.       end
  95.       if @_damage_duration > 0
  96.         @_damage_duration -= 1
  97.         case @_damage_duration
  98.         when 38..39
  99.           @_damage_sprite.y -= 4
  100.         when 36..37
  101.           @_damage_sprite.y -= 2
  102.         when 34..35
  103.           @_damage_sprite.y += 2
  104.         when 28..33
  105.           @_damage_sprite.y += 4
  106.         end
  107.         @_damage_sprite.opacity = 256 - (12 - @_damage_duration) * 32
  108.         if @_damage_duration == 0
  109.           dispose_damage
  110.         end
  111.       end
  112.       for anime in @_animation
  113.         if (Graphics.frame_count % 2 == 0)
  114.           anime[2] -= 1
  115.           update_animation(anime)
  116.         end
  117.       end
  118.       if @_loop_animation != nil and (Graphics.frame_count % 2 == 0)
  119.         update_loop_animation
  120.         @_loop_animation_index += 1
  121.         @_loop_animation_index %= @_loop_animation.frame_max
  122.       end
  123.       if @_blink
  124.         @_blink_count = (@_blink_count + 1) % 32
  125.         if @_blink_count < 16
  126.           alpha = (16 - @_blink_count) * 6
  127.         else
  128.           alpha = (@_blink_count - 16) * 6
  129.         end
  130.         self.color.set(255, 255, 255, alpha)
  131.       end
  132.       @@_animations.clear
  133.     end
  134.   
  135.     def update_animation(anime)
  136.       if anime[2] > 0
  137.         frame_index = anime[0].frame_max - anime[2]
  138.         cell_data = anime[0].frames[frame_index].cell_data
  139.         position = anime[0].position
  140.         animation_set_sprites(anime[3], cell_data, position)
  141.         for timing in anime[0].timings
  142.           if timing.frame == frame_index
  143.             animation_process_timing(timing, anime[1])
  144.           end
  145.         end
  146.       else
  147.         @@_reference_count[anime[3][0].bitmap] -= 1
  148.         if @@_reference_count[anime[3][0].bitmap] == 0
  149.             anime[3][0].bitmap.dispose
  150.         end
  151.         for sprite in anime[3]
  152.           sprite.dispose
  153.         end
  154.         @_animation.delete(anime)
  155.       end
  156.     end
  157.     def animation_set_sprites(sprites, cell_data, position)
  158.       for i in 0..15
  159.         sprite = sprites[i]
  160.         pattern = cell_data[i, 0]
  161.         if sprite == nil or pattern == nil or pattern == -1
  162.           sprite.visible = false if sprite != nil
  163.           next
  164.         end
  165.         sprite.visible = true
  166.         sprite.src_rect.set(pattern % 5 * 192, pattern / 5 * 192, 192, 192)
  167.         if position == 3
  168.           if self.viewport != nil
  169.             sprite.x = self.viewport.rect.width / 2
  170.             if $game_temp.in_battle and self.battler.is_a?(Game_Enemy)
  171.               sprite.y = self.viewport.rect.height - 320
  172.             else
  173.               sprite.y = self.viewport.rect.height - 160
  174.             end
  175.           else
  176.             sprite.x = 320
  177.             sprite.y = 240
  178.           end
  179.         else
  180.           sprite.x = self.x + self.viewport.rect.x -
  181.                       self.ox + self.src_rect.width / 2
  182.           if $game_temp.in_battle and self.battler.is_a?(Game_Enemy)
  183.             sprite.y = self.y - self.oy * self.zoom_y / 2 +
  184.                         self.viewport.rect.y
  185.             if position == 0
  186.               sprite.y -= self.src_rect.height * self.zoom_y / 4
  187.             elsif position == 2
  188.               sprite.y += self.src_rect.height * self.zoom_y / 4
  189.             end
  190.           else
  191.             sprite.y = self.y + self.viewport.rect.y -
  192.                         self.oy + self.src_rect.height / 2
  193.             sprite.y -= self.src_rect.height / 4 if position == 0
  194.             sprite.y += self.src_rect.height / 4 if position == 2
  195.           end
  196.         end
  197.         sprite.x += cell_data[i, 1]
  198.         sprite.y += cell_data[i, 2]
  199.         sprite.z = 2000
  200.         sprite.ox = 96
  201.         sprite.oy = 96
  202.         sprite.zoom_x = cell_data[i, 3] / 100.0
  203.         sprite.zoom_y = cell_data[i, 3] / 100.0
  204.         if position != 3
  205.           sprite.zoom_x *= self.zoom_x
  206.           sprite.zoom_y *= self.zoom_y
  207.         end
  208.         sprite.angle = cell_data[i, 4]
  209.         sprite.mirror = (cell_data[i, 5] == 1)
  210.         sprite.opacity = cell_data[i, 6] * self.opacity / 255.0
  211.         sprite.blend_type = cell_data[i, 7]
  212.       end
  213.     end
  214.   end
  215. end
复制代码
Tomorrow
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
57
在线时间
131 小时
注册时间
2008-8-12
帖子
184
3
 楼主| 发表于 2012-12-27 09:19:53 | 只看该作者
三天一顶
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
270 小时
注册时间
2010-2-4
帖子
1305
4
发表于 2012-12-27 11:52:55 | 只看该作者
本帖最后由 zhangbanxian 于 2012-12-28 10:38 编辑
  1. module RPG
  2.   class Sprite < ::Sprite   
  3.     def anima?(id = nil)   
  4.       x = @_animation.dup.push([@_loop_animation]).compact
  5.       return false if x.size == 0
  6.       return true if id == nil
  7.       x.each{|i| return true if i[0].id == id}
  8.       false
  9.     end  
  10.   end
  11. end
复制代码

评分

参与人数 1星屑 +30 收起 理由
hcm + 30 感谢回答

查看全部评分

好歹当年也当过大魔王过,orz
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
57
在线时间
131 小时
注册时间
2008-8-12
帖子
184
5
 楼主| 发表于 2012-12-28 08:34:09 | 只看该作者
zhangbanxian 发表于 2012-12-27 11:52

改成这一段之后,无论动画有没有显示都被判断为没有播放

点评

- -b已在楼上编辑...  发表于 2012-12-28 10:35
Tomorrow
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2025-1-8 23:52

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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