Project1

标题: 翻转(水平/垂直)动画 [打印本页]

作者: 各种压力的猫君    时间: 2012-4-3 03:33
标题: 翻转(水平/垂直)动画
本帖最后由 各种压力的猫君 于 2012-4-3 03:34 编辑

(根据提问区问题 如何将数据库动画水平翻转。编写。)


RUBY 代码复制
  1. #==============================================================================
  2. # ■ 翻转动画 by 各种压力的猫君
  3. #------------------------------------------------------------------------------
  4. #  翻转显示动画,支持水平翻转和垂直翻转,理论支持任何地方的动画显示。
  5. #------------------------------------------------------------------------------
  6. #   使用方法:
  7. #     ① 扩大你的动画数据库上限
  8. #     ② 在设定段指定翻转开始编号
  9. #     ③ 需要翻转播放时播放指定编号的动画
  10. #   特殊动画:
  11. #     数据库中动画名以[nf]结尾的动画不会被翻转显示
  12. #     数据库中动画名以[hf]结尾的动画会水平翻转显示
  13. #     数据库中动画名以[vf]结尾的动画会垂直翻转显示
  14. #     识别标示中的字母可在设定段中更改(正则表达式)
  15. #     ※特殊动画的优先级高于数字指定※
  16. #==============================================================================
  17.  
  18. #------------------------------------------------------------------------------
  19. # ● 设定段
  20. #------------------------------------------------------------------------------
  21.  
  22. module FFAni # Full_Flip_Animation
  23.  
  24.   # 水平翻转编号偏移量
  25.   # 若设定为100,则101号动画为1号动画的水平翻转(数据库中可以为空)
  26.   HF_ID = 100
  27.  
  28.   # 垂直翻转编号偏移量(※请确保这个数字比上面一个数字大!※)
  29.   # 若设定为200,则201号动画为1号动画的垂直翻转(数据库中可以为空)
  30.   VF_ID = 200
  31.  
  32.   # 特殊动画识别正则表达式
  33.   NF_Flag = /\[nf\]\z/ # 不翻转
  34.   HF_Flag = /\[hf\]\z/ # 水平翻转
  35.   VF_Flag = /\[vf\]\z/ # 垂直翻转
  36.  
  37. end
  38.  
  39. "         ┏━━━━━━━━━━━━━━━━━┓         "
  40. "         ┃※以下内容无一定脚本基础请勿修改※┃         "
  41. "         ┗━━━━━━━━━━━━━━━━━┛         "
  42.  
  43. #==============================================================================
  44. # ■ RPG::Sprite
  45. #------------------------------------------------------------------------------
  46. #  追加了 RPGXP 使用的各种效果处理的精灵的类。
  47. #==============================================================================
  48.  
  49. module RPG
  50.   class Sprite < ::Sprite
  51.     #------------------------------------------------------------------------
  52.     # ● 播放动画
  53.     #------------------------------------------------------------------------
  54.     def animation(animation, hit)
  55.       dispose_animation
  56.       @_animation = animation
  57.       #---------------------------------------------------
  58.       # 根据动画ID判断翻转情况
  59.       #---------------------------------------------------
  60.       if @_animation.id > FFAni::VF_ID    # 垂直
  61.         full_flip = 2
  62.         fixed_animation_id = @_animation.id - FFAni::VF_ID
  63.       elsif @_animation.id > FFAni::HF_ID # 水平
  64.         full_flip = 1
  65.         fixed_animation_id = @_animation.id - FFAni::HF_ID
  66.       end
  67.       #---------------------------------------------------
  68.       # 根据动画名判断翻转情况
  69.       #---------------------------------------------------
  70.       if(FFAni::NF_Flag =~ @_animation.name)  # 不翻转
  71.         full_flip = 0
  72.       elsif(FFAni::HF_Flag =~ @_animation.name) # 水平
  73.         full_flip = 1
  74.       elsif(FFAni::VF_Flag =~ @_animation.name) # 垂直
  75.         full_flip = 2
  76.       end
  77.       #---------------------------------------------------
  78.       # 修正参数
  79.       #   @_full_flip
  80.       #     0 : 不翻转
  81.       #     1 : 水平翻转
  82.       #     2 : 垂直翻转
  83.       #---------------------------------------------------
  84.       if full_flip == nil
  85.         @_full_flip = 0
  86.       else
  87.         @_full_flip = full_flip
  88.       end
  89.       unless fixed_animation_id == nil
  90.         @_animation = $data_animations[fixed_animation_id]
  91.       end
  92.       #---------------------------------------------------
  93.       return if @_animation == nil
  94.       @_animation_hit = hit
  95.       @_animation_duration = @_animation.frame_max
  96.       animation_name = @_animation.animation_name
  97.       animation_hue = @_animation.animation_hue
  98.       bitmap = RPG::Cache.animation(animation_name, animation_hue)
  99.       if @@_reference_count.include?(bitmap)
  100.         @@_reference_count[bitmap] += 1
  101.       else
  102.         @@_reference_count[bitmap] = 1
  103.       end
  104.       @_animation_sprites = []
  105.       if @_animation.position != 3 or not @@_animations.include?(animation)
  106.         for i in 0..15
  107.           sprite = ::Sprite.new(self.viewport)
  108.           sprite.bitmap = bitmap
  109.           sprite.visible = false
  110.           @_animation_sprites.push(sprite)
  111.         end
  112.         unless @@_animations.include?(animation)
  113.           @@_animations.push(animation)
  114.         end
  115.       end
  116.       update_animation
  117.     end
  118.     #------------------------------------------------------------------------
  119.     # ● 播放循环动画
  120.     #------------------------------------------------------------------------
  121.     def loop_animation(animation)
  122.       return if animation == @_loop_animation
  123.       dispose_loop_animation
  124.       @_loop_animation = animation
  125.       return if @_loop_animation == nil
  126.       @_loop_animation_index = 0
  127.       animation_name = @_loop_animation.animation_name
  128.       animation_hue = @_loop_animation.animation_hue
  129.       bitmap = RPG::Cache.animation(animation_name, animation_hue)
  130.       if @@_reference_count.include?(bitmap)
  131.         @@_reference_count[bitmap] += 1
  132.       else
  133.         @@_reference_count[bitmap] = 1
  134.       end
  135.       @_loop_animation_sprites = []
  136.       for i in 0..15
  137.         sprite = ::Sprite.new(self.viewport)
  138.         sprite.bitmap = bitmap
  139.         sprite.visible = false
  140.         @_loop_animation_sprites.push(sprite)
  141.       end
  142.       update_loop_animation
  143.     end
  144.     #------------------------------------------------------------------------
  145.     # ● 设定动画Sprites
  146.     #------------------------------------------------------------------------
  147.     def animation_set_sprites(sprites, cell_data, position)
  148.       for i in 0..15
  149.         sprite = sprites[i]
  150.         pattern = cell_data[i, 0]
  151.         if sprite == nil or pattern == nil or pattern == -1
  152.           sprite.visible = false if sprite != nil
  153.           next
  154.         end
  155.         sprite.visible = true
  156.         sprite.src_rect.set(pattern % 5 * 192, pattern / 5 * 192, 192, 192)
  157.         if position == 3
  158.           if self.viewport != nil
  159.             sprite.x = self.viewport.rect.width / 2
  160.             sprite.y = self.viewport.rect.height - 160
  161.           else
  162.             sprite.x = 320
  163.             sprite.y = 240
  164.           end
  165.         else
  166.           sprite.x = self.x - self.ox + self.src_rect.width / 2
  167.           sprite.y = self.y - self.oy + self.src_rect.height / 2
  168.           sprite.y -= self.src_rect.height / 4 if position == 0
  169.           sprite.y += self.src_rect.height / 4 if position == 2
  170.         end
  171.         #---------------------------------------------------
  172.         # 脚本本体
  173.         #---------------------------------------------------
  174.         case @_full_flip
  175.         when 0  # 啥也不做
  176.           sprite.x += cell_data[i, 1]
  177.           sprite.y += cell_data[i, 2]
  178.           sprite.angle = cell_data[i, 4]
  179.           sprite.mirror = (cell_data[i, 5] == 1)
  180.         when 1  # 水平翻转
  181.           sprite.x -= cell_data[i, 1]
  182.           sprite.y += cell_data[i, 2]
  183.           sprite.angle = 360 - cell_data[i, 4]
  184.           sprite.mirror = (cell_data[i, 5] == 0)
  185.         when 2  # 垂直翻转
  186.           sprite.x += cell_data[i, 1]
  187.           sprite.y -= cell_data[i, 2]
  188.           temp_angel = cell_data[i, 4] + 180
  189.           sprite.angle = temp_angel > 360 ? temp_angel - 360 : temp_angel   
  190.           sprite.mirror = (cell_data[i, 5] == 0)  
  191.         end
  192.         #---------------------------------------------------
  193.         sprite.z = 2000
  194.         sprite.ox = 96
  195.         sprite.oy = 96
  196.         sprite.zoom_x = cell_data[i, 3] / 100.0
  197.         sprite.zoom_y = cell_data[i, 3] / 100.0
  198.         sprite.opacity = cell_data[i, 6] * self.opacity / 255.0
  199.         sprite.blend_type = cell_data[i, 7]
  200.       end
  201.     end
  202.   end
  203. end


这没啥好截图的 = = b 用法很简单,范例不提供了。
作者: fux2    时间: 2012-4-3 18:07
还以为要用到api,angle和mirror本身就挺慢的……
作者: woshinide951    时间: 2012-4-12 14:27
怎样复制代码!
作者: 退屈£无聊    时间: 2012-5-13 08:48
其实我记得zoomxy改成负数就行……
作者: LOVE丶莫颜    时间: 2012-5-13 23:09
有图片或范例吗?能让别人更好的理解。
作者: chd114    时间: 2012-5-16 13:32
怎么用啊?表示纠结中




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