Project1
标题:
如何在脚本中插入一段设定使得该脚本运行时跳过几个人物
[打印本页]
作者:
qknight
时间:
2015-4-6 04:01
标题:
如何在脚本中插入一段设定使得该脚本运行时跳过几个人物
本帖最后由 qknight 于 2015-4-6 18:22 编辑
目前在下使用的论坛里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
复制代码
欢迎光临 Project1 (https://rpg.blue/)
Powered by Discuz! X3.1