#============================================================================== # ■ RGSS3 スプライトマッピング Ver1.00 by 星潟 #------------------------------------------------------------------------------ # パララックスマッピングに似たスプライトマッピングを実装します。 # ビューポート、ファイル名、Z座標、透過度、合成方法をそれぞれ指定し # 対象となる画像ファイルをマップ左上を起点として表示します。 #============================================================================== # マップのメモ欄に記述(複数指定可) #------------------------------------------------------------------------------ # # # 現在のマップのスプライトマップ0番として # 1に対応するビューポート(デフォではマップやキャラチップを表示する@viewport1)に # Map1Aという背景画像をZ座標を0(「プライオリティ 通常キャラより下」と同じ値)、 # 透過度255、合成タイプ0(通常)で表示する。 #------------------------------------------------------------------------------ # # # 現在のマップのスプライトマップ1番として # 1に対応するビューポート(デフォではマップやキャラチップを表示する@viewport1)に # Map1Bという背景画像をZ座標を100(「プライオリティ 通常キャラと同じ」と同じ値)、 # 透過度255、合成タイプ1(加算)で表示する。 #------------------------------------------------------------------------------ # # # 現在のマップのスプライトマップ2番として # 1に対応するビューポート(デフォではマップやキャラチップを表示する@viewport1)に # Map1Cという背景画像をZ座標を200(「プライオリティ 通常キャラより上」と同じ値)、 # 透過度255、合成タイプ2(減算)で表示する。 #============================================================================== # イベントコマンドのスクリプトで記述(複数コマンドで指定することで複数指定可) #------------------------------------------------------------------------------ # num = 0 # vnm = 1 # name = "Map2A" # z = 0 # op = 255 # bt = 0 # set_sprite_maps(num,vnm,name,z,op,bt) # # 現在のマップのスプライトマップ0番として # 1に対応するビューポート(デフォではマップやキャラチップを表示する@viewport1)に # Map2Aという背景画像をZ座標を0(「プライオリティ 通常キャラより下」と同じ値)、 # 透過度255、合成タイプ0(通常)で表示する。 # 既に0番に設定が存在する場合はこちらで上書きされる。 # (ただしマップ切り替えが発生した場合、元に戻る) #------------------------------------------------------------------------------ # delete_sprite_maps # # 現在マップのスプライトマップを全て削除する。 # (ただしマップ切り替えが発生した場合、元に戻る) #------------------------------------------------------------------------------ # delete_sprite_maps(0) # # 現在マップのスプライトマップ0番を削除する。 # (ただしマップ切り替えが発生した場合、元に戻る) #============================================================================== module SpriteMap #スプライトマップ設定用キーワードを指定。 Word = "SPM" #解放時にキャッシュのビットマップも解放するかを指定。 BitmapDispose = true #ビューポート番号に対応したビューポートの設定。 Viewport = {} Viewport[1] = "@viewport1" Viewport[2] = "@viewport2" Viewport[3] = "@viewport3" end class Spriteset_Map #-------------------------------------------------------------------------- # タイルマップの作成 #-------------------------------------------------------------------------- alias create_tilemap_sprite_maps create_tilemap def create_tilemap @sprite_maps = {} @sprite_maps_name = {} @sprite_maps_viewport_num = {} create_tilemap_sprite_maps end #-------------------------------------------------------------------------- # タイルマップの解放 #-------------------------------------------------------------------------- alias dispose_tilemap_sprite_maps dispose_tilemap def dispose_tilemap flag = AddParallaxes::BitmapDispose keys = @sprite_maps.keys keys.each {|k| dispose_sprite_maps_value(k,flag)} dispose_tilemap_sprite_maps end #-------------------------------------------------------------------------- # 追加スプライトの解放 #-------------------------------------------------------------------------- def dispose_sprite_maps_value(k,bitmap_dispose_flag) v = @sprite_maps[k] v.bitmap.dispose if bitmap_dispose_flag && v.bitmap && !v.bitmap.disposed? v.dispose @sprite_maps.delete(k) @sprite_maps_name.delete(k) end #-------------------------------------------------------------------------- # タイルマップの更新 #-------------------------------------------------------------------------- alias update_tilemap_sprite_maps update_tilemap def update_tilemap update_sprite_maps update_tilemap_sprite_maps end #-------------------------------------------------------------------------- # スプライトマップの更新 #-------------------------------------------------------------------------- def update_sprite_maps keys1 = $game_map.sprite_maps.keys keys2 = @sprite_maps.keys keys3 = [] flag = SpriteMap::BitmapDispose keys2.each {|i| dispose_sprite_maps_value(i,flag) if !keys1.include?(i)} $game_map.sprite_maps.each {|k,v| @sprite_maps[k] ||= Sprite.new(@viewport1) n = v[:viewport_num] if @sprite_maps_viewport_num[k] != n @sprite_maps_viewport_num[k] = n @sprite_maps[k].viewport = get_sprite_maps_viewport(n) end n = $game_map.sprite_maps[k][:name] if @sprite_maps_name[k] != n @sprite_maps_name[k] = n @sprite_maps[k].bitmap.dispose if flag && @sprite_maps[k].bitmap && !@sprite_maps[k].bitmap.disposed? @sprite_maps[k].bitmap = Cache.parallax(n) Graphics.frame_reset end if @sprite_maps[k].bitmap.disposed? @sprite_maps[k].bitmap = Cache.parallax(n) Graphics.frame_reset end oxd = -$game_map.adjust_x(0) * 32 oyd = -$game_map.adjust_y(0) * 32 zd = v[:z] od = v[:opacity] bd = v[:blend_type] @sprite_maps[k].ox = oxd if @sprite_maps[k].ox != oxd @sprite_maps[k].oy = oyd if @sprite_maps[k].oy != oyd @sprite_maps[k].z = zd if @sprite_maps[k].z != zd @sprite_maps[k].opacity = od if @sprite_maps[k].opacity != od @sprite_maps[k].blend_type = bd if @sprite_maps[k].blend_type != bd } end #-------------------------------------------------------------------------- # 追加スプライトのビューポートを取得 #-------------------------------------------------------------------------- def get_sprite_maps_viewport(num) t = SpriteMap::Viewport[num] return nil unless t eval(t) end end class Game_Interpreter #-------------------------------------------------------------------------- # スプライトマップの追加/再設定 #-------------------------------------------------------------------------- def set_sprite_maps(num,viewport_num,name,z,opacity,blend_type) $game_map.set_sprite_maps(num,viewport_num,name,z,opacity,blend_type) end #-------------------------------------------------------------------------- # スプライトマップの削除 #-------------------------------------------------------------------------- def delete_sprite_maps(num = nil) $game_map.delete_sprite_maps(num) end end class Game_Map attr_accessor :sprite_maps #-------------------------------------------------------------------------- # 遠景のセットアップ #-------------------------------------------------------------------------- alias setup_parallax_sprite_maps setup_parallax def setup_parallax setup_parallax_sprite_maps setup_sprite_maps end #-------------------------------------------------------------------------- # スプライトマップのセットアップ #-------------------------------------------------------------------------- def setup_sprite_maps @sprite_maps = @map.sprite_maps.clone end #-------------------------------------------------------------------------- # スプライトマップの追加/再設定 #-------------------------------------------------------------------------- def set_sprite_maps(num,viewport_num,name,z,opacity,blend_type) @sprite_maps[num] ||= {} @sprite_maps[num][:viewport_num] = viewport_num @sprite_maps[num][:name] = name @sprite_maps[num][:z] = z @sprite_maps[num][:opacity] = opacity @sprite_maps[num][:blend_type] = blend_type end #-------------------------------------------------------------------------- # スプライトマップの消去 #-------------------------------------------------------------------------- def delete_sprite_maps(num = nil) if num @sprite_maps.delete(num) else @sprite_maps = {} end end end class RPG::Map #-------------------------------------------------------------------------- # スプライトマップ #-------------------------------------------------------------------------- def sprite_maps @sprite_maps ||= create_sprite_maps end #-------------------------------------------------------------------------- # スプライトマップデータの作成 #-------------------------------------------------------------------------- def create_sprite_maps h = {} note.each_line {|l| next unless /<#{SpriteMap::Word}[::](\S+)>/ =~ l a = $1.to_s.split(/\s*,\s*/).inject([]) {|r,s| r.push(s)} next if a.size != 6 h[a[0].to_i] = { :viewport_num => a[1].to_i, :name => a[2].to_s, :z => a[3].to_i, :opacity => a[4].to_i, :blend_type => a[5].to_i}} h end end