Project1

标题: 脚本冲突 [打印本页]

作者: 黑米馒头    时间: 2011-4-7 11:31
标题: 脚本冲突
本帖最后由 黑米馒头 于 2011-4-7 11:39 编辑

大虾们帮忙整合下下面2个脚本。这2个脚本单个放游戏里没问题,不过2个一起放进去就会出现脚本问题.。

问题如下:
战斗的时候用法术,角色会附带状态动画,用了2个法术之后就出现脚本问题了。或者用了2个法术之后攻击敌人也会出现一样的脚本问题。


范例
范例.rar (4.67 MB, 下载次数: 132)




脚本1:
module RPG
  class Sprite < ::Sprite
    def animation_set_sprites(sprites, cell_data, position)
      case @_animation.id.to_i
      when 1,2..999      
        z = 0            
      else               
        z = 2000         
      end                 
      for i in 0..15
        sprite = sprites
        pattern = cell_data[i, 0]
        if sprite == nil or pattern == nil or pattern == -1
          sprite.visible = false if sprite != nil
          next
        end
        sprite.visible = true
        sprite.src_rect.set(pattern % 5 * 192, pattern / 5 * 192, 192, 192)
        if position == 3
          if self.viewport != nil
            sprite.x = self.viewport.rect.width / 2
            sprite.y = self.viewport.rect.height - 160
          else
            sprite.x = 320
            sprite.y = 240
          end
        else
          sprite.x = self.x - self.ox + self.src_rect.width / 2
          sprite.y = self.y - self.oy + self.src_rect.height / 2
          sprite.y -= self.src_rect.height / 4 if position == 0
          sprite.y += self.src_rect.height / 4 if position == 2
        end
        sprite.x += cell_data[i, 1]
        sprite.y += cell_data[i, 2]
        sprite.z = z     
        sprite.ox = 96
        sprite.oy = 96
        sprite.zoom_x = cell_data[i, 3] / 100.0
        sprite.zoom_y = cell_data[i, 3] / 100.0
        sprite.angle = cell_data[i, 4]
        sprite.mirror = (cell_data[i, 5] == 1)
        sprite.opacity = cell_data[i, 6] * self.opacity / 255.0
        sprite.blend_type = cell_data[i, 7]
      end
    end
  end
end


脚本2:
module RPG
  class Sprite < ::Sprite
    if @hzhj_alias_method_for_state_animation.nil?
      alias hzhj_old_ini_for_state_animation initialize
      alias hzhj_old_update_for_state_animation update
      alias hzhj_old_x_for_state_animation x=
      alias hzhj_old_y_for_state_animation y=
      @hzhj_alias_method_for_state_animation = true
    end
    def initialize(*args)
      @hzhj_loop_animations = []
      @hzhj_loop_sprites = {}
      @hzhj_loop_index = {}
      hzhj_old_ini_for_state_animation(*args)
    end
    def loop_animation(animation)
      return if @hzhj_loop_animations.include?(animation)
      if animation.nil?
        dispose_loop_animation
        return
      end
      @hzhj_loop_animations.push(animation)
      @hzhj_loop_index[animation] = 0
      animation_name = animation.animation_name
      animation_hue = animation.animation_hue
      bitmap = RPG::Cache.animation(animation_name, animation_hue)
      if @@_reference_count.include?(bitmap)
        @@_reference_count[bitmap] += 1
      else
        @@_reference_count[bitmap] = 1
      end
      loop_animation_sprites = []
      for i in 0..15
        sprite = ::Sprite.new(self.viewport)
        sprite.bitmap = bitmap
        sprite.visible = false
        loop_animation_sprites.push(sprite)
      end
      @hzhj_loop_sprites[animation] = loop_animation_sprites
      update_loop_animation
    end
    def dispose_loop_animation
      if not @hzhj_loop_animations.empty?
        for sprites in @hzhj_loop_sprites.values
          next if sprites.nil?
          sprite = sprites[0]
          if sprite != nil
            @@_reference_count[sprite.bitmap] -= 1
            if @@_reference_count[sprite.bitmap] == 0
              sprite.bitmap.dispose
            end
          end
          for sprite in sprites
            sprite.dispose
          end
        end
        @hzhj_loop_index.clear
        @hzhj_loop_sprites.clear
        @hzhj_loop_animations.clear
      end
    end
    def update
      hzhj_old_update_for_state_animation
      if not @hzhj_loop_animations.empty? and (Graphics.frame_count % 2 == 0)
        update_loop_animation
        for animation in @hzhj_loop_animations
          @hzhj_loop_index[animation] += 1
          @hzhj_loop_index[animation] %= animation.frame_max
        end
      end
    end
    def update_loop_animation
      if @xiaoshi2 != nil and @xiaoshi2 > 0
        @xiaoshi2 -= 1
        for animation in @hzhj_loop_animations
          frame_index = @hzhj_loop_index[animation]
          cell_data = animation.frames[frame_index].cell_data
          position = animation.position
          sprites = @hzhj_loop_sprites[animation]
          animation_set_sprites(sprites, cell_data, position, true)
        end
      else
        for animation in @hzhj_loop_animations
          frame_index = @hzhj_loop_index[animation]
          cell_data = animation.frames[frame_index].cell_data
          position = animation.position
          sprites = @hzhj_loop_sprites[animation]
          animation_set_sprites(sprites, cell_data, position)
          for timing in animation.timings
            if timing.frame == frame_index
              animation_process_timing(timing, true)
            end
          end
        end
      end
    end
    def x=(new_x)
      sx = new_x - self.x
      if sx != 0
        if not @hzhj_loop_animations.empty?
          for animation in @hzhj_loop_animations
            for i in 0..15
              @hzhj_loop_sprites[animation].x += sx
            end
          end
        end
      end
      hzhj_old_x_for_state_animation(new_x)
    end
    def y=(new_y)
      sy = new_y - self.y
      if sy != 0
        if not @hzhj_loop_animations.empty?
          for animation in @hzhj_loop_animations
            for i in 0..15
              @hzhj_loop_sprites[animation].y += sy
            end
          end
        end
      end
      hzhj_old_y_for_state_animation(new_y)
    end
    def stop_loop_animation(animation)
      return if not @hzhj_loop_animations.include?(animation)
      if not @battler.nil?
        for i in @battler.states
          next if $data_states.nil?
          if $data_states.animation_id == animation.id
            return
          end
        end
      end
      sprites = @hzhj_loop_sprites[animation]
      sprite = sprites[0]
      if sprite != nil
        @@_reference_count[sprite.bitmap] -= 1
        if @@_reference_count[sprite.bitmap] == 0
          sprite.bitmap.dispose
        end
      end
      for sprite in sprites
        sprite.dispose
      end
      @hzhj_loop_index[animation] = 0
      @hzhj_loop_sprites[animation] = nil
      @hzhj_loop_animations.delete(animation)
    end
  end
end
#==============================================================================
# ■ Game_Battler
#==============================================================================

class Game_Battler
  if @hzhj_alias_method_for_state_animation.nil?
    alias hzhj_old_ini_gb_state_animation initialize
    alias hzhj_old_add_state add_state
    alias hzhj_old_remove_state remove_state
    @hzhj_alias_method_for_state_animation = true
  end
  #--------------------------------------------------------------------------
  # ● 定义实例变量
  #--------------------------------------------------------------------------
  attr_reader   :hzhj_add_state_id
  attr_reader   :hzhj_remove_state_id
  #--------------------------------------------------------------------------
  # ● 初始化对像
  #--------------------------------------------------------------------------
  def initialize
    @hzhj_add_state_id = []
    @hzhj_remove_state_id = []
    hzhj_old_ini_gb_state_animation
  end
  #--------------------------------------------------------------------------
  # ● 附加状态
  #--------------------------------------------------------------------------
  def add_state(state_id, force = false)
    old_states = @states.clone
    hzhj_old_add_state(state_id, force)
    return if old_states == @states
    zjdzt = (@states | old_states) & @states
    jsdzt = (@states | old_states) & old_states
    for i in zjdzt
      if $data_states.animation_id > 0
        if not @hzhj_add_state_id.include?(i)
          @hzhj_add_state_id.push(i)
        end
      end
    end
    for i in jsdzt
      if $data_states.animation_id > 0
        if not @hzhj_remove_state_id.include?(i)
          @hzhj_remove_state_id.push(i)
        end
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 解除状态
  #--------------------------------------------------------------------------
  def remove_state(state_id, force = false)
    old_states = @states.clone
    hzhj_old_remove_state(state_id, force)
    return if old_states == @states
    zjdzt = (@states | old_states) & @states
    jsdzt = (@states | old_states) & old_states
    for i in zjdzt
      if $data_states.animation_id > 0
        if not @hzhj_add_state_id.include?(i)
          @hzhj_add_state_id.push(i)
        end
      end
    end
    for i in jsdzt
      if $data_states.animation_id > 0
        if not @hzhj_remove_state_id.include?(i)
          @hzhj_remove_state_id.push(i)
        end
      end
    end
  end
end
#==============================================================================
# ■ Sprite_Battler
#==============================================================================

class Sprite_Battler < RPG::Sprite
  if @hzhj_alias_sb_for_state_animation.nil?
    alias hzhj_old_init_sb_for_state_animation initialize
    alias hzhj_old_update_sb_for_state_animation update
    @hzhj_alias_sb_for_state_animation = true
  end
  #--------------------------------------------------------------------------
  # ● 初始化
  #--------------------------------------------------------------------------
  def initialize(*args)
    hzhj_old_init_sb_for_state_animation(*args)
    if not @battler.nil?
      @battler.hzhj_add_state_id.clear
      @battler.hzhj_remove_state_id.clear
      for i in @battler.states
        next if $data_states.nil?
        next if $data_states.animation_id == 0
        next if $data_animations[$data_states.animation_id].nil?
        @battler.hzhj_add_state_id.push(i)
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 刷新
  #--------------------------------------------------------------------------
  def update
    hzhj_old_update_sb_for_state_animation
    if not @battler.nil?
      if @battler.damage.nil?
        if not @battler.hzhj_add_state_id.empty?
          for i in @battler.hzhj_add_state_id
            if @battler.state?(i)
              animation_id = $data_states.animation_id
              animation = $data_animations[animation_id]
              loop_animation(animation) if not animation.nil?
            end
          end
          @battler.hzhj_add_state_id.clear
        end
        if not @battler.hzhj_remove_state_id.empty?
          for i in @battler.hzhj_remove_state_id
            if not @battler.state?(i)
              animation_id = $data_states.animation_id
              animation = $data_animations[animation_id]
              stop_loop_animation(animation) if not animation.nil?
            end
          end
          @battler.hzhj_remove_state_id.clear
        end
      end
    end
  end
end
作者: 沙漠点灰    时间: 2011-4-7 11:31
回复 黑米馒头 的帖子

貌似在范例里面把"脚本1"删掉没有问题....不放心的话,脚本1改为:
  1. module RPG
  2.   class Sprite < ::Sprite
  3.     def animation_set_sprites(sprites, cell_data, position,kds = false)
  4.       
  5.       if kds
  6.         for i in 0..15
  7.           sprites[i].visible = false
  8.         end
  9.         return
  10.       end
  11.       case @_animation.id.to_i
  12.       when 1,2..999      
  13.         self.z = 0            
  14.       else               
  15.         self.z = 2000         
  16.       end  
  17.       
  18.       for i in 0..15
  19.         sprite = sprites[i]
  20.         pattern = cell_data[i, 0]
  21.         if sprite == nil or pattern == nil or pattern == -1
  22.           sprite.visible = false if sprite != nil
  23.           next
  24.         end
  25.         sprite.visible = true
  26.         sprite.src_rect.set(pattern % 5 * 192, pattern / 5 * 192, 192, 192)
  27.         if position == 3
  28.           if self.viewport != nil
  29.             sprite.x = self.viewport.rect.width / 2
  30.             sprite.y = self.viewport.rect.height - 160
  31.           else
  32.             sprite.x = 320
  33.             sprite.y = 240
  34.           end
  35.         else
  36.           sprite.x = self.x - self.ox + self.src_rect.width / 2
  37.           sprite.y = self.y - self.oy + self.src_rect.height / 2
  38.           sprite.y -= self.src_rect.height / 4 if position == 0
  39.           sprite.y += self.src_rect.height / 4 if position == 2
  40.         end
  41.         sprite.x += cell_data[i, 1]
  42.         sprite.y += cell_data[i, 2]
  43.         sprite.z = self.z#2000
  44.         sprite.ox = 96
  45.         sprite.oy = 96
  46.         sprite.zoom_x = cell_data[i, 3] / 100.0
  47.         sprite.zoom_y = cell_data[i, 3] / 100.0
  48.         sprite.angle = cell_data[i, 4]
  49.         sprite.mirror = (cell_data[i, 5] == 1)
  50.         sprite.opacity = cell_data[i, 6] * self.opacity / 255.0
  51.         sprite.blend_type = cell_data[i, 7]
  52.       end
  53.     end

  54.   end

  55. end
复制代码
p.s lz给的范例里面把1号脚本删掉之后,没有出现"状态动画原地显示"....
作者: 烁灵    时间: 2011-4-7 11:57
脚本1
def animation_set_sprites(sprites, cell_data, position)
改成
def animation_set_sprites(sprites, cell_data, position,kds = false)
作者: 黑米馒头    时间: 2011-4-8 20:59
回复 烁灵 的帖子

那样改了不行,因为我这个系统弄起来不是真移位的,所以当主角身上附带某个状态动画时,主角去攻击敌人的话,主角原来的位置上会显示那个状态动画,我这脚本里弄起来是主角攻击敌人的时候状态动画会消失掉,攻击结束了之后就出现。按你这样改的话攻击敌人的时候状态动画还在原地显示。貌似如果不清楚的话可以看下范例。
作者: 黑米馒头    时间: 2011-4-16 19:32
回复 黑米馒头 的帖子

汗,怎么脚本放进去还是有漏洞,例如我把1号动画Z坐标设置成0,2号为2,角色战斗图的Z坐标为1,1号动画为状态动画(当角色附带某个状态的时候就持续显示这个动画),战斗的时候角色附带这个动画,显示是这样的,角色显示在1号动画上面,当角色用2号动画(显示在角色战斗图上面)的时候1号动画也会变成显示在战斗图上面,等2号动画结束的时候1号动画才恢复成显示在战斗图下面。请帮忙改成,当角色用2号动画的时候1号动画还是显示在战斗图下面,会的话帮忙改下




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