#============================================================================== # ■ RGSS3 遠景追加 Ver2.03a by 星潟 #------------------------------------------------------------------------------ # 遠景を無制限に追加します。 # 通常の遠景と異なり、Z座標やビューポート、合成方法も選択できます。 # Z座標を大きく設定する事で、所謂前景も設定出来ます。 # # Ver2.00より固定遠景も追加可能になりました。 # 固定遠景は自動的にスクロールすることはありませんが # プレイヤーの動きに合わせてスクロールします。 # これはパララックスマッピングを想定した機能となっています。 # # 実質的に遠景固定化・遠景フォグシステムを統合しつつ # さらに機能性を強化した上位スクリプトとなります。 #============================================================================== # マップのメモ欄に記述(複数指定可) #------------------------------------------------------------------------------ # <遠景追加:0,1,Map1A,true,true,2,2,0,255,0> # # 現在のマップのスプライトマップ0番として # 1に対応するビューポート(デフォではマップやキャラチップを表示する@viewport1)に # Map1Aという背景画像を横縦共にループし、縦2、横2の速度でスクロール表示。 # Z座標を0(「プライオリティ 通常キャラより下」と同じ値)、 # 透過度255、合成タイプ0(通常)で表示する。 #------------------------------------------------------------------------------ # <遠景追加:1,2,Map1B,false,false,0,0,100,255,1> # # 現在のマップのスプライトマップ1番として # 1に対応するビューポート(デフォではピクチャ、タイマー等を表示する@viewport2)に # Map1Bという背景画像を横縦共にループさせず、縦横2共にスクロールせず表示。 # Z座標を100、透過度255、合成タイプ1(加算)で表示する。 #------------------------------------------------------------------------------ # <遠景追加:2,3,Map1C,true,false,1,0,200,255,2> # # 現在のマップのスプライトマップ2番として # 1に対応するビューポート(デフォでは全体の明るさを司る@viewport3)に # Map1Cという背景画像を横のみループさせ、横1の速度でスクロール表示。 # Z座標を200、透過度255、合成タイプ2(減算)で表示する。 #------------------------------------------------------------------------------ # <固定遠景追加:0,1,Map1A,0,255,0> # # 現在のマップのスプライトマップ0番として # 1に対応するビューポート(デフォではマップやキャラチップを表示する@viewport1)に # Map1Aという背景画像を固定遠景として表示する。 #------------------------------------------------------------------------------ # <固定遠景追加:1,2,Map1B,100,255,1> # # 現在のマップのスプライトマップ1番として # 1に対応するビューポート(デフォではピクチャ、タイマー等を表示する@viewport2)に # Map1Bという背景画像を固定遠景として表示する。 #------------------------------------------------------------------------------ # <固定遠景追加:2,3,Map1C,200,255,2> # # 現在のマップのスプライトマップ2番として # 1に対応するビューポート(デフォでは全体の明るさを司る@viewport3)に # Map1Cという背景画像を固定遠景として表示する。 #============================================================================== # イベントコマンドのスクリプトで記述(複数コマンドで指定することで複数指定可) #------------------------------------------------------------------------------ # num = 0 # vnm = 1 # name = "StarlitSky" # loop_x = true # loop_y = false # sx = 4 # sy = 0 # z = 300 # op = 200 # bt = 1 # set_parallaxes( # num,vnm,name,loop_x,loop_y,sx,sy,z,op,bt) # # 現在のマップの追加背景0番として # 1に対応するビューポート(デフォではマップやキャラチップを表示する@viewport1)に # "StarlitSky"という背景画像を # 横のみループする設定で、速度4でスクロール。 # Z座標を300(「プライオリティ 通常キャラより上」よりも上の値)、 # 透過度200、合成タイプ1(加算)で表示する。 # # 既に0番に設定が存在する場合はこちらで上書きされる。 # (ただしマップ切り替えが発生した場合、元に戻る) #------------------------------------------------------------------------------ # num = 0 # vnm = 1 # name = "StarlitSky" # z = 300 # op = 200 # bt = 1 # set_fix_parallaxes( # num,vnm,name,z,op,bt) # # 現在のマップの追加背景0番として # 1に対応するビューポート(デフォではマップやキャラチップを表示する@viewport1)に # "StarlitSky"という背景画像を # Z座標を300(「プライオリティ 通常キャラより上」よりも上の値)、 # 透過度200、合成タイプ1(加算)で固定遠景として表示する。 # # 既に0番に設定が存在する場合はこちらで上書きされる。 # (ただしマップ切り替えが発生した場合、元に戻る) #------------------------------------------------------------------------------ # delete_parallaxes # # 現在マップの追加背景を全て削除する。 # (ただしマップ切り替えが発生した場合、元に戻る) #------------------------------------------------------------------------------ # delete_parallaxes(0) # # 現在マップの追加背景0番を削除する。 # (ただしマップ切り替えが発生した場合、元に戻る) #============================================================================== module AddParallaxes #遠景追加の設定用キーワードを指定。 Word1 = "遠景追加" #固定遠景追加の設定用キーワードを指定。 Word2 = "固定遠景追加" #解放時にキャッシュのビットマップも解放するかを指定。 BitmapDispose = true #ビューポート番号に対応したビューポートの設定。 Viewport = {} Viewport[1] = "@viewport1" Viewport[2] = "@viewport2" Viewport[3] = "@viewport3" end class Spriteset_Map #-------------------------------------------------------------------------- # 遠景の作成 #-------------------------------------------------------------------------- alias create_parallax_add_parallaxes create_parallax def create_parallax create_parallax_add_parallaxes clear_add_parallaxes end #-------------------------------------------------------------------------- # 追加遠景関連データを初期化 #-------------------------------------------------------------------------- def clear_add_parallaxes @parallaxes = {} @parallaxes_name = {} @parallaxes_viewport_num = {} end #-------------------------------------------------------------------------- # 遠景の解放 #-------------------------------------------------------------------------- alias dispose_parallax_add_parallaxes dispose_parallax def dispose_parallax dispose_parallax_add_parallaxes dispose_add_parallaxes end #-------------------------------------------------------------------------- # 追加遠景関連データの解放 #-------------------------------------------------------------------------- def dispose_add_parallaxes flag = AddParallaxes::BitmapDispose keys = @parallaxes.keys keys.each {|k| dispose_parallaxes_value(k,flag)} end #-------------------------------------------------------------------------- # 追加遠景を解放 #-------------------------------------------------------------------------- def dispose_parallaxes_value(k,bitmap_dispose_flag) v = @parallaxes[k] v.bitmap.dispose if bitmap_dispose_flag && v.bitmap && !v.bitmap.disposed? v.dispose @parallaxes.delete(k) @parallaxes_name.delete(k) end #-------------------------------------------------------------------------- # 遠景の更新 #-------------------------------------------------------------------------- alias update_parallax_add_parallaxes update_parallax def update_parallax update_parallax_add_parallaxes if $game_map.parallaxes_force_update $game_map.parallaxes_force_update = false dispose_add_parallaxes clear_add_parallaxes end keys1 = $game_map.parallaxes.keys keys2 = @parallaxes.keys keys3 = [] flag = AddParallaxes::BitmapDispose keys2.each {|i| dispose_parallaxes_value(i,flag) if !keys1.include?(i)} $game_map.parallaxes.each {|k,v| @parallaxes[k] ||= Plane.new n = v[:viewport_num] if @parallaxes_viewport_num[k] != n @parallaxes_viewport_num[k] = n @parallaxes[k].viewport = get_parallaxes_viewport(n) end n = $game_map.parallaxes[k][:name] if @parallaxes_name[k] != n @parallaxes_name[k] = n @parallaxes[k].bitmap.dispose if flag && @parallaxes[k].bitmap && !@parallaxes[k].bitmap.disposed? @parallaxes[k].bitmap = Cache.parallax(n) Graphics.frame_reset end if @parallaxes[k].bitmap.disposed? @parallaxes[k].bitmap = Cache.parallax(n) Graphics.frame_reset end oxd = $game_map.parallaxes_ox(k,@parallaxes[k].bitmap) oyd = $game_map.parallaxes_oy(k,@parallaxes[k].bitmap) zd = v[:z] od = v[:opacity] bd = v[:blend_type] @parallaxes[k].ox = oxd if @parallaxes[k].ox != oxd @parallaxes[k].oy = oyd if @parallaxes[k].oy != oyd @parallaxes[k].z = zd if @parallaxes[k].z != zd @parallaxes[k].opacity = od if @parallaxes[k].opacity != od @parallaxes[k].blend_type = bd if @parallaxes[k].blend_type != bd } end #-------------------------------------------------------------------------- # 追加遠景のビューポートを取得 #-------------------------------------------------------------------------- def get_parallaxes_viewport(num) t = AddParallaxes::Viewport[num] return nil unless t eval(t) end end class Game_Interpreter #-------------------------------------------------------------------------- # 追加遠景の追加/再設定 #-------------------------------------------------------------------------- def set_parallaxes(num,viewport_num,name,loop_x,loop_y,sx,sy,z,opacity,blend_type) $game_map.set_parallaxes(num,:normal,viewport_num,name,loop_x,loop_y,sx,sy,z,opacity,blend_type) end #-------------------------------------------------------------------------- # 追加固定遠景の追加/再設定 #-------------------------------------------------------------------------- def set_fix_parallaxes(num,viewport_num,name,z,opacity,blend_type) $game_map.set_parallaxes(num,:fix,viewport_num,name,false,false,0,0,z,opacity,blend_type) end #-------------------------------------------------------------------------- # 追加遠景/追加固定遠景の削除 #-------------------------------------------------------------------------- def delete_parallaxes(num = nil) $game_map.delete_parallaxes(num) end end class Game_Map attr_accessor :parallaxes_force_update attr_accessor :parallaxes #-------------------------------------------------------------------------- # 遠景のセットアップ #-------------------------------------------------------------------------- alias setup_parallax_add_parallaxes setup_parallax def setup_parallax setup_parallax_add_parallaxes setup_parallaxes end #-------------------------------------------------------------------------- # 遠景の更新 #-------------------------------------------------------------------------- alias update_parallax_add_parallaxes update_parallax def update_parallax update_parallax_add_parallaxes @parallaxes.each {|k,v| next if v[:type] == :fix v[:x] += v[:sx] / 64.0 if v[:loop_x] v[:y] += v[:sy] / 64.0 if v[:loop_y]} end #-------------------------------------------------------------------------- # 追加遠景の設定 #-------------------------------------------------------------------------- def setup_parallaxes @parallaxes = @map.parallaxes.clone @parallaxes_force_update = true end #-------------------------------------------------------------------------- # 追加遠景の追加/再設定 #-------------------------------------------------------------------------- def set_parallaxes(num,type,viewport_num,name,loop_x,loop_y,sx,sy,z,opacity,blend_type) @parallaxes[num] ||= {} @parallaxes[num][:viewport_num] = viewport_num @parallaxes[num][:type] = type flag = @parallaxes[num][:name] != name @parallaxes[num][:name] = name @parallaxes[num][:loop_x] = loop_x @parallaxes[num][:loop_y] = loop_y @parallaxes[num][:sx] = sx @parallaxes[num][:sy] = sy @parallaxes[num][:z] = z @parallaxes[num][:opacity] = opacity @parallaxes[num][:blend_type] = blend_type if type == :fix @parallaxes[num][:x] = -adjust_x(display_x) * 32 @parallaxes[num][:y] = -adjust_y(display_y) * 32 else if flag @parallaxes[num][:x] = 0 @parallaxes[num][:y] = 0 else @parallaxes[num][:x] ||= 0 @parallaxes[num][:y] ||= 0 end end end #-------------------------------------------------------------------------- # 追加遠景の削除 #-------------------------------------------------------------------------- def delete_parallaxes(num = nil) if num @parallaxes.delete(num) else @parallaxes = {} end end #-------------------------------------------------------------------------- # 追加遠景のX座標 #-------------------------------------------------------------------------- def parallaxes_ox(k,bitmap) v = @parallaxes[k] if v[:type] == :fix -adjust_x(v[:x]) * 32 else if v[:loop_x] v[:x] * 16 else w1 = [bitmap.width - Graphics.width, 0].max w2 = [width * 32 - Graphics.width, 1].max v[:x] * 16 * w1 / w2 end end end #-------------------------------------------------------------------------- # 追加遠景のY座標 #-------------------------------------------------------------------------- def parallaxes_oy(k,bitmap) v = @parallaxes[k] if v[:type] == :fix -$game_map.adjust_y(v[:y]) * 32 else if v[:loop_y] v[:y] * 16 else h1 = [bitmap.height - Graphics.height, 0].max h2 = [height * 32 - Graphics.height, 1].max v[:y] * 16 * h1 / h2 end end end #-------------------------------------------------------------------------- # 下にスクロール #-------------------------------------------------------------------------- alias scroll_down_add_parallaxes scroll_down def scroll_down(distance) last_y = @display_y scroll_down_add_parallaxes(distance) if loop_vertical? @parallaxes.each {|k,v| next if v[:type] == :fix v[:y] += distance if v[:loop_y]} else @parallaxes.each {|k,v| next if v[:type] == :fix v[:y] += @display_y - last_y} end end #-------------------------------------------------------------------------- # 左にスクロール #-------------------------------------------------------------------------- alias scroll_left_add_parallaxes scroll_left def scroll_left(distance) last_x = @display_x scroll_left_add_parallaxes(distance) if loop_horizontal? @parallaxes.each {|k,v| next if v[:type] == :fix v[:x] -= distance if v[:loop_x]} else @parallaxes.each {|k,v| next if v[:type] == :fix v[:x] += @display_x - last_x} end end #-------------------------------------------------------------------------- # 右にスクロール #-------------------------------------------------------------------------- alias scroll_right_add_parallaxes scroll_right def scroll_right(distance) last_x = @display_x scroll_right_add_parallaxes(distance) if loop_horizontal? @parallaxes.each {|k,v| next if v[:type] == :fix v[:x] += distance if v[:loop_x]} else @parallaxes.each {|k,v| next if v[:type] == :fix v[:x] += @display_x - last_x} end end #-------------------------------------------------------------------------- # 上にスクロール #-------------------------------------------------------------------------- alias scroll_up_add_parallaxes scroll_up def scroll_up(distance) last_y = @display_y scroll_up_add_parallaxes(distance) if loop_vertical? @parallaxes.each {|k,v| next if v[:type] == :fix v[:y] -= distance if v[:loop_y]} else @parallaxes.each {|k,v| next if v[:type] == :fix v[:y] += @display_y - last_y} end end end class RPG::Map #-------------------------------------------------------------------------- # 追加遠景 #-------------------------------------------------------------------------- def parallaxes @parallaxes ||= create_parallaxes end #-------------------------------------------------------------------------- # 追加遠景データの作成 #-------------------------------------------------------------------------- def create_parallaxes h = {} note.each_line {|l| if /<#{AddParallaxes::Word1}[::](\S+)>/ =~ l a = $1.to_s.split(/\s*,\s*/).inject([]) {|r,s| r.push(s)} next if a.size != 10 h[a[0].to_i] = { :type => :normal, :viewport_num => a[1].to_i, :name => a[2].to_s, :loop_x => eval(a[3].to_s), :loop_y => eval(a[4].to_s), :sx => a[5].to_i, :sy => a[6].to_i, :z => a[7].to_i, :opacity => a[8].to_i, :blend_type => a[9].to_i, :x => 0, :y => 0} elsif /<#{AddParallaxes::Word2}[::](\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] = { :type => :fix, :viewport_num => a[1].to_i, :name => a[2].to_s, :loop_x => false, :loop_y => false, :sx => 0, :sy => 0, :z => a[3].to_i, :opacity => a[4].to_i, :blend_type => a[5].to_i, :x => 0, :y => 0} end } h end end