Project1

标题: 关于多重状态的多重动画的问题。。。 [打印本页]

作者: CR~    时间: 2018-4-22 11:39
标题: 关于多重状态的多重动画的问题。。。
本帖最后由 CR~ 于 2018-4-22 12:45 编辑

用了能够显示多重状态所有动画的脚本,,然后出现了一个问题。。。
我用了齐时战斗,,所以就出现了这样的情况。。

额,,,怎么能让他在释放技能,显示技能的动画时所有状态的动画先消失一下。。。?

以下是脚本

RUBY 代码复制
  1. #======================================================================
  2. # 脚本来自[url]www.66rpg.com[/url],使用或转载请保留此信息
  3. # 功能:多状态动画同时显示
  4. # 版本:2.01
  5. # 作者:后知后觉 2011-3-2
  6. # 使用方法:插入Main前即可
  7. # 冲突可能:只要在你的脚本编辑器内没有对 RPG::Sprite 或 Sprite_Battler 类
  8. #           以下三个方法做出过别的定义 则就有较大的兼容性
  9. #           loop_animation
  10. #           dispose_loop_animation
  11. #           update_loop_animation
  12. #======================================================================
  13.  
  14. module RPG
  15.   class Sprite < ::Sprite
  16.     if @hzhj_alias_method_for_state_animation.nil?
  17.       alias hzhj_old_ini_for_state_animation initialize
  18.       alias hzhj_old_update_for_state_animation update
  19.       alias hzhj_old_x_for_state_animation x=
  20.       alias hzhj_old_y_for_state_animation y=
  21.       @hzhj_alias_method_for_state_animation = true
  22.     end
  23.     def initialize(*args)
  24.       @hzhj_loop_animations = []
  25.       @hzhj_loop_sprites = {}
  26.       @hzhj_loop_index = {}
  27.       hzhj_old_ini_for_state_animation(*args)
  28.     end
  29.     def loop_animation(animation)
  30.       return if @hzhj_loop_animations.include?(animation)
  31.       if animation.nil?
  32.         dispose_loop_animation
  33.         return
  34.       end
  35.       @hzhj_loop_animations.push(animation)
  36.       @hzhj_loop_index[animation] = 0
  37.       animation_name = animation.animation_name
  38.       animation_hue = animation.animation_hue
  39.       bitmap = RPG::Cache.animation(animation_name, animation_hue)
  40.       if @@_reference_count.include?(bitmap)
  41.         @@_reference_count[bitmap] += 1
  42.       else
  43.         @@_reference_count[bitmap] = 1
  44.       end
  45.       loop_animation_sprites = []
  46.       for i in 0..15
  47.         sprite = ::Sprite.new(self.viewport)
  48.         sprite.bitmap = bitmap
  49.         sprite.visible = false
  50.         loop_animation_sprites.push(sprite)
  51.       end
  52.       @hzhj_loop_sprites[animation] = loop_animation_sprites
  53.       update_loop_animation
  54.     end
  55.     def dispose_loop_animation
  56.       if not @hzhj_loop_animations.empty?
  57.         for sprites in @hzhj_loop_sprites.values
  58.           next if sprites.nil?
  59.           sprite = sprites[0]
  60.           if sprite != nil
  61.             @@_reference_count[sprite.bitmap] -= 1
  62.             if @@_reference_count[sprite.bitmap] == 0
  63.               sprite.bitmap.dispose
  64.             end
  65.           end
  66.           for sprite in sprites
  67.             sprite.dispose
  68.           end
  69.         end
  70.         @hzhj_loop_index.clear
  71.         @hzhj_loop_sprites.clear
  72.         @hzhj_loop_animations.clear
  73.       end
  74.     end
  75.     def update
  76.       hzhj_old_update_for_state_animation
  77.       if not @hzhj_loop_animations.empty? and (Graphics.frame_count % 2 == 0)
  78.         update_loop_animation
  79.         for animation in @hzhj_loop_animations
  80.           @hzhj_loop_index[animation] += 1
  81.           @hzhj_loop_index[animation] %= animation.frame_max
  82.         end
  83.       end
  84.     end
  85.     def update_loop_animation
  86.       for animation in @hzhj_loop_animations
  87.         frame_index = @hzhj_loop_index[animation]
  88.         cell_data = animation.frames[frame_index].cell_data
  89.         position = animation.position
  90.         sprites = @hzhj_loop_sprites[animation]
  91.         animation_set_sprites(sprites, cell_data, position)
  92.         for timing in animation.timings
  93.           if timing.frame == frame_index
  94.             animation_process_timing(timing, true)
  95.           end
  96.         end
  97.       end
  98.     end
  99.     def x=(new_x)
  100.       sx = new_x - self.x
  101.       if sx != 0
  102.         if not @hzhj_loop_animations.empty?
  103.           for animation in @hzhj_loop_animations
  104.             for i in 0..15
  105.               @hzhj_loop_sprites[animation][i].x += sx
  106.             end
  107.           end
  108.         end
  109.       end
  110.       hzhj_old_x_for_state_animation(new_x)
  111.     end
  112.     def y=(new_y)
  113.       sy = new_y - self.y
  114.       if sy != 0
  115.         if not @hzhj_loop_animations.empty?
  116.           for animation in @hzhj_loop_animations
  117.             for i in 0..15
  118.               @hzhj_loop_sprites[animation][i].y += sy
  119.             end
  120.           end
  121.         end
  122.       end
  123.       hzhj_old_y_for_state_animation(new_y)
  124.     end
  125.     def stop_loop_animation(animation)
  126.       return if not @hzhj_loop_animations.include?(animation)
  127.       if not @battler.nil?
  128.         for i in @battler.states
  129.           next if $data_states[i].nil?
  130.           if $data_states[i].animation_id == animation.id
  131.             return
  132.           end
  133.         end
  134.       end
  135.       sprites = @hzhj_loop_sprites[animation]
  136.       sprite = sprites[0]
  137.       if sprite != nil
  138.         @@_reference_count[sprite.bitmap] -= 1
  139.         if @@_reference_count[sprite.bitmap] == 0
  140.           sprite.bitmap.dispose
  141.         end
  142.       end
  143.       for sprite in sprites
  144.         sprite.dispose
  145.       end
  146.       @hzhj_loop_index[animation] = 0
  147.       @hzhj_loop_sprites[animation] = nil
  148.       @hzhj_loop_animations.delete(animation)
  149.     end
  150.   end
  151. end
  152. #==============================================================================
  153. # ■ Game_Battler
  154. #==============================================================================
  155.  
  156. class Game_Battler
  157.   if @hzhj_alias_method_for_state_animation.nil?
  158.     alias hzhj_old_ini_gb_state_animation initialize
  159.     alias hzhj_old_add_state add_state
  160.     alias hzhj_old_remove_state remove_state
  161.     @hzhj_alias_method_for_state_animation = true
  162.   end
  163.   #--------------------------------------------------------------------------
  164.   # ● 定义实例变量
  165.   #--------------------------------------------------------------------------
  166.   attr_reader   :hzhj_add_state_id
  167.   attr_reader   :hzhj_remove_state_id
  168.   #--------------------------------------------------------------------------
  169.   # ● 初始化对像
  170.   #--------------------------------------------------------------------------
  171.   def initialize
  172.     @hzhj_add_state_id = []
  173.     @hzhj_remove_state_id = []
  174.     hzhj_old_ini_gb_state_animation
  175.   end
  176.   #--------------------------------------------------------------------------
  177.   # ● 附加状态
  178.   #--------------------------------------------------------------------------
  179.   def add_state(state_id, force = false)
  180.     old_states = @states.clone
  181.     hzhj_old_add_state(state_id, force)
  182.     return if old_states == @states
  183.     zjdzt = (@states | old_states) & @states
  184.     jsdzt = (@states | old_states) & old_states
  185.     for i in zjdzt
  186.       if $data_states[i].animation_id > 0
  187.         if not @hzhj_add_state_id.include?(i)
  188.           @hzhj_add_state_id.push(i)
  189.         end
  190.       end
  191.     end
  192.     for i in jsdzt
  193.       if $data_states[i].animation_id > 0
  194.         if not @hzhj_remove_state_id.include?(i)
  195.           @hzhj_remove_state_id.push(i)
  196.         end
  197.       end
  198.     end
  199.   end
  200.   #--------------------------------------------------------------------------
  201.   # ● 解除状态
  202.   #--------------------------------------------------------------------------
  203.   def remove_state(state_id, force = false)
  204.     old_states = @states.clone
  205.     hzhj_old_remove_state(state_id, force)
  206.     return if old_states == @states
  207.     zjdzt = (@states | old_states) & @states
  208.     jsdzt = (@states | old_states) & old_states
  209.     for i in zjdzt
  210.       if $data_states[i].animation_id > 0
  211.         if not @hzhj_add_state_id.include?(i)
  212.           @hzhj_add_state_id.push(i)
  213.         end
  214.       end
  215.     end
  216.     for i in jsdzt
  217.       if $data_states[i].animation_id > 0
  218.         if not @hzhj_remove_state_id.include?(i)
  219.           @hzhj_remove_state_id.push(i)
  220.         end
  221.       end
  222.     end
  223.   end
  224. end
  225. #==============================================================================
  226. # ■ Sprite_Battler
  227. #==============================================================================
  228.  
  229. class Sprite_Battler < RPG::Sprite
  230.   if @hzhj_alias_sb_for_state_animation.nil?
  231.     alias hzhj_old_init_sb_for_state_animation initialize
  232.     alias hzhj_old_update_sb_for_state_animation update
  233.     @hzhj_alias_sb_for_state_animation = true
  234.   end
  235.   #--------------------------------------------------------------------------
  236.   # ● 初始化
  237.   #--------------------------------------------------------------------------
  238.   def initialize(*args)
  239.     hzhj_old_init_sb_for_state_animation(*args)
  240.     if not @battler.nil?
  241.       @battler.hzhj_add_state_id.clear
  242.       @battler.hzhj_remove_state_id.clear
  243.       for i in @battler.states
  244.         next if $data_states[i].nil?
  245.         next if $data_states[i].animation_id == 0
  246.         next if $data_animations[$data_states[i].animation_id].nil?
  247.         @battler.hzhj_add_state_id.push(i)
  248.       end
  249.     end
  250.   end
  251.   #--------------------------------------------------------------------------
  252.   # ● 刷新
  253.   #--------------------------------------------------------------------------
  254.   def update
  255.     hzhj_old_update_sb_for_state_animation
  256.     if not @battler.nil?
  257.       if @battler.damage.nil?
  258.         if not @battler.hzhj_add_state_id.empty?
  259.           for i in @battler.hzhj_add_state_id
  260.             if @battler.state?(i)
  261.               animation_id = $data_states[i].animation_id
  262.               animation = $data_animations[animation_id]
  263.               loop_animation(animation) if not animation.nil?
  264.             end
  265.           end
  266.           @battler.hzhj_add_state_id.clear
  267.         end
  268.         if not @battler.hzhj_remove_state_id.empty?
  269.           for i in @battler.hzhj_remove_state_id
  270.             if not @battler.state?(i)
  271.               animation_id = $data_states[i].animation_id
  272.               animation = $data_animations[animation_id]
  273.               stop_loop_animation(animation) if not animation.nil?
  274.             end
  275.           end
  276.           @battler.hzhj_remove_state_id.clear
  277.         end
  278.       end
  279.     end
  280.   end
  281. end
  282.  
  283. #======================================================================
  284. # 脚本来自 [url]www.66rpg.com[/url] 使用或转载请保留此信息
  285. # 功能:多状态动画同时显示
  286. # 版本:2.01
  287. # 作者:后知后觉 2011-3-2
  288. # 使用方法:插入Main前即可
  289. #======================================================================

作者: 89444640    时间: 2018-4-22 12:16
这个状态动画是我忽略的bug之一,角色动画显示时候,状态动画依然在角色所在的位置循环,因为我不能改,就无视了。
多数RPG状态动画跟着角色走的,但是XP的动画只是播放效果,没有角色实际的位置移动。所以……
另外我这用的XP相当古老版本的全动画脚本动画,好多人帮我修bug来着,再往前几个版本,连状态虚幻动画都不能显示,
我估计要是让出招瞬间不显示状态动画,估计……又得出其他问题。
希望能有人帮忙弄过来,不过我这冲突估计……
如果不好改的话,妥协方法,只显示角色态图标,不显示状态循环动画。
作者: 灯笼菜刀王    时间: 2018-4-22 12:39
本帖最后由 灯笼菜刀王 于 2018-4-22 12:50 编辑

楼主, 发脚本代码的话,要用"代码框" 圈起来,  否则会出现符号错乱

像你这个脚本,中间某个符号就和html冲突了, 导致后面变斜体显示了.....

要在攻击的时候让循环动画停止的话, 这样就可以了吧
if xxxx.animation_id != 0
  xxx.loop_animation(nil)
end
打完后要怎么加回来再说...   

不过,看了下, 这个脚本作者重定义了loop_animation..... 以上估计行不通

看得头大, 咱对此脚本没兴趣,不想研究, 等高手来吧
作者: CR~    时间: 2018-4-22 14:04
话说,,,能不能弄成当动画有隐藏对象的指令时,动态动画暂时消失,无论是攻击者还是被攻击者。




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