#============================================================================== # ■ RGSS3 マップ・キャラクター波形描画 Ver1.00 by 星潟 #------------------------------------------------------------------------------ # マップとキャラクターに波形描画を適用します。 # 正確には、マップとキャラクターを描写しているビューポートの画像を # 一枚の画像として保存し、その画像に対して波形描画を適用した上で # マップとキャラクターよりも上に表示させることで波形描画を実現させています。 # # デフォルト設定として、水中、陽炎、船揺れを用意しています。 #============================================================================== module MapWaveEffect #空のハッシュを用意。 W = {} #処理内容決定用の変数IDを指定。 VID = 42 #画像取得用のビューポートの変数名を指定。(通常は変更不要) TV = ["@viewport1"] #画像取得用のビューポートに一時的に追加するZ座標補正値を指定。 TVZ = 100000000 #波形描画中の画面更新速度を指定。 #数字が小さいほど早くなるが、負荷が増大。 Frequence = 2 #変数毎の設定を用意。 #例. #W[1] = { #:amp => 1, #:length => 3, #:speed => 20, #:zoom_x => 1.002, #:zoom_y => 1.002} #この場合、VIDで指定したIDの変数に格納された値が1の場合 #波の強さは1、 #波の周期は3(3以上でなければ効果が見込めない)、 #波の速度は20、 #横幅は1.002倍、 #高さは1.002倍となる。 #(幅と高さを大きくするのは、波によって画面の欠けが発生しかねない為) #変数の値が1の場合の設定(水中想定) W[1] = { :amp => 1, :length => 3, :speed => 20, :zoom_x => 1.002, :zoom_y => 1.002} #変数の値が2の場合の設定(陽炎想定) W[2] = { :amp => 1, :length => 3, :speed => 10, :zoom_x => 1.002, :zoom_y => 1.002} #変数の値が3の場合の設定(船揺れ想定) W[3] = { :amp => 2, :length => 2, :speed => 5, :zoom_x => 1.002, :zoom_y => 1.002} end class Game_Map attr_accessor :map_wave_phase end class Spriteset_Map #-------------------------------------------------------------------------- # ビューポートの解放 #-------------------------------------------------------------------------- alias dispose_viewports_wave_effect dispose_viewports def dispose_viewports dispose_wave_viewport_sprite dispose_viewports_wave_effect end #-------------------------------------------------------------------------- # ビューポートの更新 #-------------------------------------------------------------------------- alias update_viewports_wave_effect update_viewports def update_viewports update_viewports_wave_effect update_wave_viewport_sprite end #-------------------------------------------------------------------------- # 波形描画スプライトの更新 #-------------------------------------------------------------------------- def update_wave_viewport_sprite wave_v = $game_variables[MapWaveEffect::VID] if @last_wave != wave_v @last_wave = wave_v dispose_wave_viewport_sprite if @wave_viewport_sprite if MapWaveEffect::W[wave_v] a = MapWaveEffect::TV.collect {|v| eval(v)} @wave_viewport_sprite ||= Sprite_MapWave.new(nil,a) end $game_map.map_wave_phase = nil end @wave_viewport_sprite.update if @wave_viewport_sprite end #-------------------------------------------------------------------------- # 波形描画スプライトの解放 #-------------------------------------------------------------------------- def dispose_wave_viewport_sprite if @wave_viewport_sprite @wave_viewport_sprite.dispose @wave_viewport_sprite = nil end end end class Sprite_MapWave < Sprite #-------------------------------------------------------------------------- # 初期化 #-------------------------------------------------------------------------- def initialize(main_viewport,target_viewports) super(main_viewport) @target_viewports = target_viewports @setting = MapWaveEffect::W[$game_variables[MapWaveEffect::VID]] self.wave_amp = @setting[:amp] self.wave_length = @setting[:length] self.wave_speed = @setting[:speed] self.zoom_x = @setting[:zoom_x] self.zoom_y = @setting[:zoom_y] self.wave_phase = $game_map.map_wave_phase if $game_map.map_wave_phase self.z = (@target_viewports.max_by {|v| v.z}).z @update_count = 0 end #-------------------------------------------------------------------------- # 初期化 #-------------------------------------------------------------------------- def update super update_bitmap update_position $game_map.map_wave_phase = self.wave_phase end #-------------------------------------------------------------------------- # ビットマップ更新 #-------------------------------------------------------------------------- def update_bitmap if @update_count == 0 dispose_bitmap az = MapWaveEffect::TVZ @target_viewports.each {|v| v.z += az} self.bitmap = Graphics.snap_to_bitmap @target_viewports.each {|v| v.z -= az} end @update_count += 1 @update_count = 0 if @update_count >= MapWaveEffect::Frequence end #-------------------------------------------------------------------------- # 位置の更新 #-------------------------------------------------------------------------- def update_position self.ox = self.bitmap.width * (@setting[:zoom_x] - 1) / 2 self.oy = self.bitmap.height * (@setting[:zoom_y] - 1) / 2 end #-------------------------------------------------------------------------- # 解放 #-------------------------------------------------------------------------- def dispose dispose_bitmap super end #-------------------------------------------------------------------------- # ビットマップ解放 #-------------------------------------------------------------------------- def dispose_bitmap self.bitmap.dispose if self.bitmap self.bitmap = nil end end