#============================================================================== # 「アバターシステム」(ACE) ver.2.0 # 製作者:奈々(なな) # へぷたなすくろーる http://heptanas.mamagoto.com/ # # ◇使用規約 # 使用される場合はスクリプト作成者として「奈々」を明記して下さい。 # このスクリプトを改変したり、改変したものを配布するなどは自由ですが # その場合も元のスクリプトの作成者として名前は載せて下さい。 # その他、詳しい利用規約はブログを参照して下さい。 # #------------------------------------------------------------------------------ # # 「アバター画像」を組み合わせた歩行グラフィックを表示します。 # アバター画像は、アクターの装備品やステートなどに応じて変更でき # 画像を重ねるため、キャラクターの「着せ替え」や「装備」を手軽に表現できます。 # 具体的な使い方やテクニックなどは、ブログの記事を参考にして下さい。 # # # <画像ファイルを用意する> # ・ダミー画像(識別用) # 「avatar_actor_base」または「$avatar_actor_base」という歩行グラを用意します。 # この歩行グラを指定したアクターは、歩行グラの変わりにアバターが表示されます。 # (avatar_actor_base自体は表示されませんので、透明にする必要はありません) # また、この画像のサイズがアバターのサイズの基準となります。 # # イベントキャラクターなどに、アクターのアバターを表示したい場合は # 「avatar_actor_1」という歩行グラを用意して指定すれば # 1番のアクターのアバターが表示されます。 # # # ・アバター画像(表示用) # 初期設定でフォルダを指定できます。 # アバター画像の名前は自由で、$の付いた1キャラ分の画像も使えます。 # キャラサイズはavatar_actor_baseと同じになるようにして下さい。 # # avatar_actor_baseとアバター画像の両方が8キャラ仕様の場合は # インデックス番号に対応したアバターが表示されます。 # これによって性別や体型の違いなどバリエーションを用意できます。 # # # ・インデックスの変更 # デフォルトでも一応出来ますが、些か使い勝手が悪いので用意してあります。 # イベントコマンドのスクリプトで # n7_change_c_index("アクターID", "インデックス") # を入力すると、アクターの歩行グラのインデックスのみを変更できます。 # # # <アバター画像を設定する> # ・アバターの仕組み # アバター画像を重ねて、リアルタイムで生成される歩行グラが、アバターです。 # 重ね方の順番は「レイヤ番号」で指定し、大きい方が上になります。 # また同じレイヤ番号が指定されている場合は、優先順位に従って上書きされます。 # # 未指定のレイヤは飛ばされるため、いきなり100番を指定しても重くはなりません。 # (むしろレイヤ番号は、ある程度飛ばし飛ばしで設定したほうが後々修正が利きます) # # アバター画像の指定は共通で、メモ欄に↓のタグを書きます。 # <アバター "レイヤ番号" "ファイル名"> # 例えば「<アバター 0 Actor1>」なら0番レイヤにActor1.pngを設定します。 # 複数タグを書くことで、1項目に何枚でも設定可能です。 # # # ・基本アバターの設定 # アクター毎のアバター画像で、要するに顔や体など「裸」に相当するものです。 # アクターのメモ欄でアバター画像を指定すると # ゲーム開始時の基本アバターが設定できます。 # # また、イベントコマンドのスクリプトで # n7_cab("アクターID", "レイヤ番号", "ファイル名") # を入力すると基本アバターが変更できます。 # ※このファイル名は""で囲ってください。例:n7_cab(1,0,"Avatar1") # # # ・追加アバターの設定 # ステート・装備・スキル・クラスのメモ欄でアバター画像を指定すると # アクターがそれを身につけている場合に適用されます。 # 同レイヤの優先順位は、ステート>装備>スキル>クラス>基本アバターです。 # # # ・アバター画像の不透明度指定 # タグやコマンドではアバター画像の不透明度を指定できます。 # これによって半透明のエフェクトや、画像の色合成も可能になります。 # # <アバター "レイヤ番号" "ファイル名" "不透明度"> # n7_cab("アクターID", "レイヤ番号", "ファイル名" "不透明度") # 0だと透明、255だと指定なしと同じく不透明です。 # # #============================================================================== # ◇初期設定 module N7_Avatar AVATAR_FOLDER = "Graphics/Characters/" #アバター画像のフォルダ。歩行グラと同じなら「"Graphics/Characters/"」。 DEBUG_MODE = false #動作チェック用、基本的にfalseのまま変更しない。 end #============================================================================== # ■ RPG::BaseItem #------------------------------------------------------------------------------ # アクター・装備・ステートなどを総括して扱うデータクラス。 #============================================================================== class RPG::BaseItem #-------------------------------------------------------------------------- # ● アバター画像 #-------------------------------------------------------------------------- def avatar_graphics avatar = [] @note.scan(/<アバター\s+(\d+)\s+(.+)>/){|s| avatar[$1.to_i] = [$2.to_s, 255] } @note.scan(/<アバター\s+(\d+)\s+(.+)\s+(\d+)>/){|s| avatar[$1.to_i] = [$2.to_s, $3.to_i] } return avatar end end #============================================================================== # ■ Game_Actor #------------------------------------------------------------------------------ # アクターを扱うクラスです。このクラスは Game_Actors クラス($game_actors) # の内部で使用され、Game_Party クラス($game_party)からも参照されます。 #============================================================================== class Game_Actor < Game_Battler #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_accessor :avatar_base # 基本アバター #-------------------------------------------------------------------------- # ● セットアップ #-------------------------------------------------------------------------- alias avatar_setup setup def setup(actor_id) avatar_setup(actor_id) @avatar_base = Array.new actor.avatar_graphics.each.with_index{|graphic,i| avatar_base[i] = graphic if graphic } end #-------------------------------------------------------------------------- # ● アバター画像配列(結合) #-------------------------------------------------------------------------- def avatar_mix avatar = @avatar_base.dup self.class.avatar_graphics.each.with_index{|graphic,i| avatar[i] = graphic if graphic } skills.each{|skill| next unless skill skill.avatar_graphics.each.with_index{|graphic,i| avatar[i] = graphic if graphic } } equips.each{|equip| next unless equip equip.avatar_graphics.each.with_index{|graphic,i| avatar[i] = graphic if graphic } } states.each{|state| next unless state state.avatar_graphics.each.with_index{|graphic,i| avatar[i] = graphic if graphic } } p avatar if N7_Avatar::DEBUG_MODE return avatar end #-------------------------------------------------------------------------- # ● 歩行グラフィックの強制指定 #-------------------------------------------------------------------------- def character_name if @character_name == "avatar_actor_base" "avatar_actor_" + @actor_id.to_s elsif @character_name == "$avatar_actor_base" "$avatar_actor_" + @actor_id.to_s else @character_name end end end #============================================================================== # ■ Cache #------------------------------------------------------------------------------ # 各種グラフィックを読み込み、Bitmap オブジェクトを作成、保持するモジュール # です。読み込みの高速化とメモリ節約のため、作成した Bitmap オブジェクトを内部 # のハッシュに保存し、同じビットマップが再度要求されたときに既存のオブジェクト # を返すようになっています。 #============================================================================== module Cache #-------------------------------------------------------------------------- # ● 歩行グラフィックの取得 #-------------------------------------------------------------------------- def self.character(filename) p "歩行グラフィックの取得" if N7_Avatar::DEBUG_MODE if filename[/avatar_actor_(\d+)/] || filename[/\$avatar_actor_(\d+)/] load_avatar($game_actors[$1.to_i], filename) elsif filename[/avatar_party_(\d+)/] || filename[/\$avatar_party_(\d+)/] filename[/party/] = "actor" load_avatar($game_party.members[$1.to_i], filename) else load_bitmap("Graphics/Characters/", filename) end end #-------------------------------------------------------------------------- # ● アバターグラフィックの取得 #-------------------------------------------------------------------------- def self.load_avatar(actor, filename) p "アバターグラフィックの取得" if N7_Avatar::DEBUG_MODE if filename[0,1] == "$" bitmap1 = load_bitmap("Graphics/Characters/", "$avatar_actor_base").dup else bitmap1 = load_bitmap("Graphics/Characters/", "avatar_actor_base").dup end bitmap1.clear actor.avatar_mix.each{|avatar| if avatar bitmap2 = load_bitmap(N7_Avatar::AVATAR_FOLDER, avatar[0]) bitmap1.blt(0, 0, bitmap2, bitmap2.rect, avatar[1]) if avatar[0,1] == "$" && filename[0,1] != "$" bitmap1.blt(bitmap2.width, 0, bitmap2, bitmap2.rect, avatar[1]) bitmap1.blt(bitmap2*2.width, 0, bitmap2, bitmap2.rect, avatar[1]) bitmap1.blt(bitmap2*3.width, 0, bitmap2, bitmap2.rect, avatar[1]) bitmap1.blt(0, bitmap2.height, bitmap2, bitmap2.rect, avatar[1]) bitmap1.blt(bitmap2.width, bitmap2.height, bitmap2, bitmap2.rect, avatar[1]) bitmap1.blt(bitmap2.width*2, bitmap2.height, bitmap2, bitmap2.rect, avatar[1]) bitmap1.blt(bitmap2.width*3, bitmap2.height, bitmap2, bitmap2.rect, avatar[1]) end end } return bitmap1 end end #============================================================================== # ■ Game_Interpreter #------------------------------------------------------------------------------ # イベントコマンドを実行するインタプリタです。このクラスは Game_Map クラス、 # Game_Troop クラス、Game_Event クラスの内部で使用されます。 #============================================================================== class Game_Interpreter #-------------------------------------------------------------------------- # ● 基本アバターを変更する #-------------------------------------------------------------------------- def n7_cab(actor_id, layer, filename = nil, opacity = 255) $game_actors[actor_id].avatar_base[layer] = filename ? [filename, opacity] : nil $nana_avatar_refresh = true Fiber.yield $nana_avatar_refresh = false end #-------------------------------------------------------------------------- # ● アクターの画像インデックスだけ変更 #-------------------------------------------------------------------------- def n7_change_c_index(actor_id, index) actor = $game_actors[actor_id] actor.set_graphic(actor.character_name, index, actor.face_name, actor.face_index) $game_player.refresh end end #============================================================================== # ■ Sprite_Character #------------------------------------------------------------------------------ # キャラクター表示用のスプライトです。Game_Character クラスのインスタンスを # 監視し、スプライトの状態を自動的に変化させます。 #============================================================================== class Sprite_Character < Sprite_Base #-------------------------------------------------------------------------- # ● グラフィックの変更判定 #-------------------------------------------------------------------------- def graphic_changed? @tile_id != @character.tile_id || @character_name != @character.character_name || @character_index != @character.character_index || (@character_name[/avatar_actor_/] && $nana_avatar_refresh) end end