赞 | 0 |
VIP | 0 |
好人卡 | 4 |
积分 | 3 |
经验 | 27857 |
最后登录 | 2024-2-20 |
在线时间 | 377 小时 |
Lv2.观梦者
- 梦石
- 0
- 星屑
- 342
- 在线时间
- 377 小时
- 注册时间
- 2013-1-30
- 帖子
- 219
|
本帖最后由 qknight 于 2014-7-9 02:52 编辑
- =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
复制代码 这个脚本是在一个日本的RPG游戏中看到的,觉得很实用就搬了过来,当然无版权许可,所以仅供学习参考用。
因为本人不懂日语和脚本,所以这个脚本也就刚刚会用罢了,范例自然也没有,就个人使用情况看,与楼主的脚本非常相似,关键的不同在于,这个更完善,可以用来显示衣服、裤子、内衣、袜子……从里到外的全套服装。
PS:要使用这个脚本,不论主角们的行走图还是衣服素材的行走图必须是384X256格式
PS2:服装的备注栏里填<歩行グラ 勇者, 0 => 10, 10, 10, 10>
这其中”勇者“是服装素材图的名字,”0“是使用的素材在行走图中的位置,上面一排从左到右是0、1、2、3,下面一排是4、5、6、7,后面的数字大概是人物朝向前后左右时显示的优先级 |
评分
-
查看全部评分
|