#============================================================================== # ★ Tile_Hue_Change ver1.0 by USK #------------------------------------------------------------------------------ # ・タイルセット毎に任意のマップチップの任意の部位の色調を変えます。 #============================================================================== =begin タイルセットのメモ欄に のように <(種類),(色相),(変更範囲x座標),(変更範囲y座標),(横幅),(縦幅),(不透明度)> を記述するとマップチップの指定範囲の色相、不透明度を変更できます。 座標・幅の単位は1タイル分(32ピクセル)です。 不透明度は省略可能で、省略すると通常通りの不透明度になります。 例  は  と同じ メモ欄には以下のように複数記入することが可能です。 =end #============================================================================== # ■ Cache #============================================================================== module Cache #-------------------------------------------------------------------------- # ● タイルセット グラフィックの取得 #-------------------------------------------------------------------------- class << self; alias :usk_hue_tileset :tileset; end def self.tileset(filename) hue_map = $game_map.hue_map(filename) hue_map.empty? ? usk_hue_tileset(filename) : load_hue_tileset(filename, hue_map) end #-------------------------------------------------------------------------- # ● ビットマップの読み込み #-------------------------------------------------------------------------- def self.load_hue_tileset(filename, hue_map) @cache ||= {} if filename.empty? @cache[key] = empty_bitmap else path = "Graphics/Tilesets/" + filename key = [path, hue_map] unless include?(key) @cache[key] = normal_bitmap(path).clone hue_map.each do |map| b = Bitmap.new(*map.size) b.blt(0, 0, @cache[path], map.rect, map.opacity) b.hue_change(map.hue) @cache[key].clear_rect(map.rect) @cache[key].stretch_blt(map.rect, b, b.rect) b.dispose end end end @cache[key] end end #============================================================================== # ■ Game_Map #============================================================================== class Game_Map #-------------------------------------------------------------------------- # ● タイルセットの変更 #-------------------------------------------------------------------------- alias :usk_hue_change_tileset :change_tileset def change_tileset(tileset_id) usk_hue_change_tileset(tileset_id) @hue_map = get_hue_map end #-------------------------------------------------------------------------- # ● セットアップ #-------------------------------------------------------------------------- alias :usk_hue_setup :setup def setup(map_id) usk_hue_setup(map_id) @hue_map = get_hue_map end#-------------------------------------------------------------------------- # ● #-------------------------------------------------------------------------- def hue_map(filename) @hue_map[filename] end #-------------------------------------------------------------------------- # ● #-------------------------------------------------------------------------- def get_hue_map ret = {} tileset = $data_tilesets[@tileset_id] [:A1, :A2, :A3, :A4, :A5, :B, :C, :D, :E].each_with_index do |sym, i| ret[tileset.tileset_names[i]] ||= [] tileset.note.scan(/<#{sym},(\d+),(\d+,\d+,\d+,\d+),?(\d+)?>/m) do |s| a = eval("[#{$2}]").collect{|v| v << 5} hue = $1.to_i opacity = $3 ? $3.to_i : 255 ret[tileset.tileset_names[i]] << Hue_Map.new(hue, Rect.new(*a), opacity) end end ret end end #============================================================================== # ■ #============================================================================== class Hue_Map attr_reader :hue, :rect, :opacity #-------------------------------------------------------------------------- # ● #-------------------------------------------------------------------------- def initialize(hue, rect, opacity) @hue = hue @rect = rect @opacity = opacity end #-------------------------------------------------------------------------- # ● #-------------------------------------------------------------------------- def pos [@rect.x, @rect.y] end #-------------------------------------------------------------------------- # ● #-------------------------------------------------------------------------- def size [@rect.width, @rect.height] end end