| 
 
| 赞 | 0 |  
| VIP | 0 |  
| 好人卡 | 4 |  
| 积分 | 3 |  
| 经验 | 27857 |  
| 最后登录 | 2024-2-20 |  
| 在线时间 | 377 小时 |  
 Lv2.观梦者 
	梦石0 星屑342 在线时间377 小时注册时间2013-1-30帖子219 | 
| 
本帖最后由 qknight 于 2015-4-6 18:22 编辑
x
加入我们,或者,欢迎回来。您需要 登录 才可以下载或查看,没有帐号?注册会员  
 目前在下使用的论坛里tan12345大神的一套宠物脚本以及外站的一个重叠行走图的脚本产生了冲突。
 具体来说,就是宠物脚本里有这样一个功能,副本入队(将ID为actor_id的人物以副本的形式加入队伍,强制初始化),这样子就可以让同样的人物,比如4个阿奈思特一起组队打BOSS。
 不过外站的那个脚本的功能就是可以将几个行走图叠加在一个人物身上,比如说一个基础人物的行走图,我们可以用这个脚本在原行走图上再叠加上一套炫酷的盔甲,而且可以做到换不同的盔甲实时叠加上不同的盔甲行走图。但也因此,一旦用副本入队的脚本加入克隆出来的人物后,外站脚本就无法识别该ID的人物,然后就开始报错弹出了。
 所以在下在此求一个修改的方法,如何在该换装脚本中插入一段设定使得该脚本运行时忽略那几个宠物角色,不再对他们起作用。
 
  复制代码=begin  =======================================================================
  ☆ 歩行グラ着せ替えスクリプト
-------------------------------------------------------------------------------
  アクターの歩行グラをレイヤー化し、装備による着せ替えを可能にします。
-------------------------------------------------------------------------------
  [使い方]
    1. Graphics/Charactersに装備レイヤーの歩行グラをインポートします。
    2. グラフィックを設定したい装備に以下のようにタグを記述します。
    
      <歩行グラ fn, index => f_priority, l_priority, r_priority, b_priority>
      
      * fn
          ファイル名(拡張子は省略可)
          
        index
          キャラクターインデックス、
          歩行グラを設定する際に使用するものと同じ(0, 1, 2, ..., 7)
          
        (f, l, r, b)_priority
          前, 左, 右, 後ろ向きに対する指定画像のプライオリティ
          0を除く任意の整数で指定します。
          キャラクターの画像のプライオリティを0とし、
          プライオリティの高い順から上のレイヤーとして描画されます。
          なお、複数の装備の間でプライオリティがかぶっている場合、
          下で設定する装備タイプでのレイヤー優先度に準拠します。
          
  [注意事項]
    セーブファイルの歩行グラ他、
    他素材で使用される歩行グラには反映されないことがあります。
    そのため、セーブファイルに関しては顔グラを表示する素材などを使用してください。
    
=end
#==============================================================================
# ■ 設定項目
#==============================================================================
module WS
  module CG
    EquipType_Priority = [0, 1, 2, 3, 4]
      # 装備タイプでのレイヤー優先度を設定します。
      # 配列の各要素は装備タイプIDに対応します(0 = 武器, 1 = 盾, ...)。
      # 他素材で装備タイプを拡張している場合、それに対応した値を
      # 追加してください。
      # レイヤーの優先度はインデックス0 > 1 > 2 ...という感じになります。
  end
end
#==============================================================================
# ■ PlayerGraphics
#------------------------------------------------------------------------------
#  プレイヤーの歩行グラフィックのデータクラスです。
#==============================================================================
class PlayerGraphics
  #--------------------------------------------------------------------------
  # ● 公開インスタンス変数
  #--------------------------------------------------------------------------
  attr_reader :data
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #--------------------------------------------------------------------------
  def initialize(actor)
    @actor = actor
    set_data
  end
  #--------------------------------------------------------------------------
  # ● データのクリア
  #--------------------------------------------------------------------------
  def clear_data
    @data = []
    base_data = [@actor.character_name, @actor.character_index]
    4.times {|i| @data[i] = {0 => base_data} }
  end
  #--------------------------------------------------------------------------
  # ● データキャッシュの設定
  #--------------------------------------------------------------------------
  def set_cache
    @data_cache = @data.dup
  end
  #--------------------------------------------------------------------------
  # ● データの設定
  #--------------------------------------------------------------------------
  def set_data
    clear_data
    @actor.equips.compact.each do |equip|
      note = equip.note.scan(/<(?:歩行グラ|character_graphic)\s*(.+?)\s*\,\s*(\d+)\s*=>\s(\-*\d+)\s*\,\s*(\-*\d+)\s*\,\s*(\-*\d+)\s*\,\s*(\-*\d+)\s*>/).flatten
      next if note.empty?
      e_p = (WS::CG::EquipType_Priority.index(equip.etype_id) || WS::CG::EquipType_Priority.size) * 0.01
      for i in 0..3
        @data[i][note[i + 2].to_i - e_p] = [$1, $2.to_i]
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● ビットマップの更新確認
  #--------------------------------------------------------------------------
  def need_for_update
    return @data_cache != @data
  end
end
#==============================================================================
# ■ Game_Actor
#------------------------------------------------------------------------------
#  アクターを扱うクラスです。
#==============================================================================
class Game_Actor
  #--------------------------------------------------------------------------
  # ● 公開インスタンス変数
  #--------------------------------------------------------------------------
  attr_reader :character_graphic
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #--------------------------------------------------------------------------
  alias ws_player_graphic_initialize initialize
  def initialize(actor_id)
    ws_player_graphic_initialize(actor_id)
    @character_graphic = PlayerGraphics.new(self)
  end
  #--------------------------------------------------------------------------
  # ● グラフィックの変更
  #--------------------------------------------------------------------------
  alias ws_player_graphic_set_graphic set_graphic
  def set_graphic(c_name, c_index, f_name, f_index)
    ws_player_graphic_set_graphic(c_name, c_index, f_name, f_index)
    @character_graphic.set_data
    Cache.update_player_bitmap(self)
    SceneManager.scene.spriteset.refresh_characters if SceneManager.scene.is_a?(Scene_Map)
  end
end
#==============================================================================
# ■ Cache
#==============================================================================
module Cache
  #--------------------------------------------------------------------------
  # ● プレイヤーの歩行グラフィックの取得
  #--------------------------------------------------------------------------
  def self.player(actor_id)
    init_player_bitmap unless @players
    return @players[actor_id]
  end
  #--------------------------------------------------------------------------
  # ● プレイヤーの歩行グラフィックの配列作成
  #--------------------------------------------------------------------------
  def self.init_player_bitmap
    @players = []
    for i in 1...$data_actors.size
      actor = $game_actors[i]
      set_player_bitmap(actor)
    end
  end
  #--------------------------------------------------------------------------
  # ● プレイヤーの歩行グラフィックのビットマップ作成
  #--------------------------------------------------------------------------
  def self.set_player_bitmap(actor)
    base = character(actor.character_name)
    cw = base.width / 12
    ch = base.height / 8
    bitmap = Bitmap.new(cw * 3, ch * 4)
    base_rect = Rect.new(0, 0, cw * 3, ch)
    actor.character_graphic.data.each_with_index do |data, index|
      data.keys.sort.each do |priority|
        src_bitmap = Cache.character(data[priority][0])
        src_rect = base_rect.dup
        src_rect.x, src_rect.y = cw * (data[priority][1] % 4) * 3, ch * ((data[priority][1] / 4) * 4 + index)
        bitmap.blt(0, ch * index, src_bitmap, src_rect)
      end
    end
    @players[actor.id] = bitmap
  end
  #--------------------------------------------------------------------------
  # ● プレイヤーの歩行グラフィックの更新
  #--------------------------------------------------------------------------
  def self.update_player_bitmap(actor)
    @players[actor.id].dispose
    set_player_bitmap(actor)
  end
end
#==============================================================================
# ■ Sprite_Character
#------------------------------------------------------------------------------
#  キャラクター表示用のスプライトです。
#==============================================================================
class Sprite_Character
  #--------------------------------------------------------------------------
  # ● キャラクターのビットマップを設定
  #--------------------------------------------------------------------------
  alias ws_player_graphic_set_character_bitmap set_character_bitmap
  def set_character_bitmap
    if @character.is_a?(Game_Player) || @character.is_a?(Game_Follower)
      self.bitmap = @character.actor ? Cache.player(@character.actor.id) : Cache.empty_bitmap
      @cw = bitmap.width / 3
      @ch = bitmap.height / 4
      self.ox = @cw / 2
      self.oy = @ch
    else
      ws_player_graphic_set_character_bitmap
    end
  end
  #--------------------------------------------------------------------------
  # ● 転送元矩形の更新
  #--------------------------------------------------------------------------
  alias ws_player_graphic_update_src_rect update_src_rect
  def update_src_rect
    if @character.is_a?(Game_Player) || @character.is_a?(Game_Follower)
      pattern = @character.pattern < 3 ? @character.pattern : 1
      sx = pattern * @cw
      sy = (@character.direction - 2) / 2 * @ch
      self.src_rect.set(sx, sy, @cw, @ch)
    else
      ws_player_graphic_update_src_rect
    end
  end
end
#==============================================================================
# ■ Scene_Equip
#------------------------------------------------------------------------------
#  装備画面の処理を行うクラスです。
#==============================================================================
class Scene_Equip
  #--------------------------------------------------------------------------
  # ● 開始処理
  #--------------------------------------------------------------------------
  alias ws_player_graphic_start start
  def start
    ws_player_graphic_start
    $game_party.members.each {|member| member.character_graphic.set_cache }
  end
  #--------------------------------------------------------------------------
  # ● 終了前処理
  #--------------------------------------------------------------------------
  alias ws_player_graphic_pre_terminate pre_terminate
  def pre_terminate
    ws_player_graphic_pre_terminate
    $game_party.members.each do |member|
      member.character_graphic.set_data
      Cache.update_player_bitmap(member) if member.character_graphic.need_for_update
    end
  end
end
#==============================================================================
# ■ Scene_Map
#------------------------------------------------------------------------------
#  マップ画面の処理を行うクラスです。
#==============================================================================
class Scene_Map
  #--------------------------------------------------------------------------
  # ● 公開インスタンス変数
  #--------------------------------------------------------------------------
  attr_reader :spriteset
end
#==============================================================================
# ■ Game_Interpreter
#------------------------------------------------------------------------------
#  イベントの処理を行うインタプリタのクラスです。
#==============================================================================
class Game_Interpreter
  #--------------------------------------------------------------------------
  # ● 装備の変更
  #--------------------------------------------------------------------------
  alias ws_player_graphic_command_319 command_319
  def command_319
    actor = $game_actors[@params[0]]
    actor.character_graphic.set_cache if actor
    ws_player_graphic_command_319
    actor.character_graphic.set_data if actor
    if actor && actor.character_graphic.need_for_update
      Cache.update_player_bitmap(actor)
      SceneManager.scene.spriteset.refresh_characters if SceneManager.scene.is_a?(Scene_Map)
    end
  end
end
#==============================================================================
# ■ Game_Player
#------------------------------------------------------------------------------
#  プレイヤーを扱うクラスです。
#==============================================================================
class Game_Player
  #--------------------------------------------------------------------------
  # ● 移動コマンドの処理
  #--------------------------------------------------------------------------
  alias ws_player_graphic_process_move_command process_move_command
  def process_move_command(command)
    ws_player_graphic_process_move_command(command)
    params = command.parameters
    if command.code == ROUTE_CHANGE_GRAPHIC
      actor.set_graphic(params[0], params[1], actor.face_name, actor.face_index)
      SceneManager.scene.spriteset.refresh_characters if SceneManager.scene.is_a?(Scene_Map)
    end
  end
end
 | 
 |