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

Project1

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

[已经解决] 脚本冲突

 关闭 [复制链接]

Lv3.寻梦者

梦石
0
星屑
3606
在线时间
1891 小时
注册时间
2010-6-19
帖子
1211
跳转到指定楼层
1
发表于 2011-4-3 21:26:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 黑米馒头 于 2011-4-4 19:17 编辑

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

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


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



脚本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

Lv1.梦旅人

梦石
0
星屑
55
在线时间
323 小时
注册时间
2010-8-21
帖子
666
2
发表于 2011-4-4 14:48:09 | 只看该作者
回复 黑米馒头 的帖子

整合...?什么意思...?若只是去掉异常,仅仅是"脚本2"的Game_Battler出现了逻辑上
的Bug(顺序不对),
  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

扔到Game_Battler末就可以了...
即:
  1. #==============================================================================
  2. # ■ Game_Battler
  3. #==============================================================================

  4. class Game_Battler
  5.   #--------------------------------------------------------------------------
  6.   # ● 定义实例变量
  7.   #--------------------------------------------------------------------------
  8.   attr_reader   :hzhj_add_state_id
  9.   attr_reader   :hzhj_remove_state_id
  10.   #--------------------------------------------------------------------------
  11.   # ● 初始化对像
  12.   #--------------------------------------------------------------------------
  13.   def initialize
  14.     @hzhj_add_state_id = []
  15.     @hzhj_remove_state_id = []
  16.     hzhj_old_ini_gb_state_animation
  17.   end
  18.   #--------------------------------------------------------------------------
  19.   # ● 附加状态
  20.   #--------------------------------------------------------------------------
  21.   def add_state(state_id, force = false)
  22.     old_states = @states.clone
  23.     hzhj_old_add_state(state_id, force)
  24.     return if old_states == @states
  25.     zjdzt = (@states | old_states) & @states
  26.     jsdzt = (@states | old_states) & old_states
  27.     for i in zjdzt
  28.       if $data_states[i].animation_id > 0
  29.         if not @hzhj_add_state_id.include?(i)
  30.           @hzhj_add_state_id.push(i)
  31.         end
  32.       end
  33.     end
  34.     for i in jsdzt
  35.       if $data_states[i].animation_id > 0
  36.         if not @hzhj_remove_state_id.include?(i)
  37.           @hzhj_remove_state_id.push(i)
  38.         end
  39.       end
  40.     end
  41.   end
  42.   #--------------------------------------------------------------------------
  43.   # ● 解除状态
  44.   #--------------------------------------------------------------------------
  45.   def remove_state(state_id, force = false)
  46.     old_states = @states.clone
  47.     hzhj_old_remove_state(state_id, force)
  48.     return if old_states == @states
  49.     zjdzt = (@states | old_states) & @states
  50.     jsdzt = (@states | old_states) & old_states
  51.     for i in zjdzt
  52.       if $data_states[i].animation_id > 0
  53.         if not @hzhj_add_state_id.include?(i)
  54.           @hzhj_add_state_id.push(i)
  55.         end
  56.       end
  57.     end
  58.     for i in jsdzt
  59.       if $data_states[i].animation_id > 0
  60.         if not @hzhj_remove_state_id.include?(i)
  61.           @hzhj_remove_state_id.push(i)
  62.         end
  63.       end
  64.     end
  65.   end
  66.   if @hzhj_alias_method_for_state_animation.nil?
  67.     alias hzhj_old_ini_gb_state_animation initialize
  68.     alias hzhj_old_add_state add_state
  69.     alias hzhj_old_remove_state remove_state
  70.     @hzhj_alias_method_for_state_animation = true
  71.   end
  72. end
复制代码
>>猛戳>>MetalSagaR游戏主页<<这里<<
欢迎提供您的意见
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-25 15:49

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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