=begin ▼ 乗り物擬似3D化 視界拡張 ver. 2.1 RPGツクールVXAce用スクリプト 制作 : 木星ペンギン URL : http://woodpenguin.blog.fc2.com/ ------------------------------------------------------------------------------ 概要 □ 乗り物擬似3D化の視界距離を伸ばします。 □ 軽量化の効果もあります。 □ 本スクリプトは、乗り物疑似3D化スクリプトのオプションです。 ------------------------------------------------------------------------------ 使い方 □ 追加パラメータの簡易説明 :view_zoom => 視界距離。1.0で標準。 上限はありませんが 2.0 以下推奨。 ------------------------------------------------------------------------------ 注意事項 □ タイルマップをビットマップに変換した際、メモリを大量に使用します。 ・広いマップではメモリが足りなくなる恐れがあります。 ・メモリの上限はゲームをプレイする人の環境によって変わります。 ・マップサイズが 160 × 160 を超える場合は、アニメーションなしを推奨します。 =end module WdTk::Veh3D::OP2 #-------------------------------------------------------------------------- # ● 予め作成するマップ ID の配列 #-------------------------------------------------------------------------- SetupMap = [] #-------------------------------------------------------------------------- # ● 作成時に表示するフォントと文字列 #-------------------------------------------------------------------------- SetupFont = Font.new SetupFont.outline = false SetupText = "Loading..." #-------------------------------------------------------------------------- # ● 作成したマップをキャッシュに入れるかどうか #-------------------------------------------------------------------------- MapCache = false #-------------------------------------------------------------------------- # ● マップアニメーションの有無 #-------------------------------------------------------------------------- MapAnime = true #-------------------------------------------------------------------------- # ● イベントを表示するかどうか #-------------------------------------------------------------------------- ShowEvent = true #-------------------------------------------------------------------------- # ● 乗り物を表示するかどうか #-------------------------------------------------------------------------- ShowVehic = true end #////////////////////////////////////////////////////////////////////////////// # # 以降、変更する必要なし # #////////////////////////////////////////////////////////////////////////////// module WdTk module Veh3D::OP2 #-------------------------------------------------------------------------- # ● 初期化 #-------------------------------------------------------------------------- def self.init @@load_sprite = nil @@padding = (Graphics.height * WdTk::Veh3D.max_view_zoom).to_i return if SetupMap.empty? create_load_sprite SetupMap.each_with_index do |map_id, i| $game_map.setup(map_id) spriteset = Spriteset_Map.new spriteset.select_characters bitmaps = create_map(map_id, spriteset) WdTk.save_map(map_id, bitmaps) spriteset.dispose end dispose_load_sprite GC.start end #-------------------------------------------------------------------------- # ● マップ作成中の文字の作成 #-------------------------------------------------------------------------- def self.create_load_sprite bitmap = Bitmap.new(1, 1) bitmap.font = SetupFont.dup rect = bitmap.text_size(SetupText) rect.width += 8 bitmap.dispose @@load_sprite = Sprite.new @@load_sprite.bitmap = Bitmap.new(rect.width, rect.height + 8) @@load_sprite.bitmap.font = SetupFont.dup @@load_sprite.bitmap.draw_text(rect, SetupText) @@load_sprite.x = Graphics.width - @@load_sprite.width - 24 @@load_sprite.y = Graphics.height - @@load_sprite.height - 24 @@load_count = 0 update_load_sprite end #-------------------------------------------------------------------------- # ● マップ作成中の文字の開放 #-------------------------------------------------------------------------- def self.dispose_load_sprite @@load_sprite.bitmap.dispose @@load_sprite.dispose @@load_sprite = nil end #-------------------------------------------------------------------------- # ● マップ作成中の文字の更新 #-------------------------------------------------------------------------- def self.update_load_sprite y = SetupFont.size + 4 w = @@load_sprite.width - 8 @@load_sprite.bitmap.clear_rect(0, y, w, 4) @@load_sprite.bitmap.fill_rect(0, y, w, 4, Color.new(64, 64, 64)) w *= @@load_count / SetupMap.size @@load_sprite.bitmap.fill_rect(0, y, w, 4, Color.new(255, 255, 255)) @@load_sprite.visible = true Graphics.frame_reset Graphics.update Graphics.frame_count -= 1 @@load_sprite.visible = false end #-------------------------------------------------------------------------- # ● マップ作成 #-------------------------------------------------------------------------- def self.create_map(map_id, spriteset) bitmaps = WdTk.load_map(map_id) unless bitmaps last_brightness = Graphics.brightness Graphics.brightness = 255 n = Veh3D::OP2::MapAnime ? 3 : 1 bitmaps = Array.new(n) do spriteset.snap_viewport bitmap = snap_map(spriteset) 30.times { spriteset.update_tilemap } if @@load_sprite spriteset.hide @@load_count += 1.0 / n update_load_sprite end bitmap end WdTk.save_map(map_id, bitmaps) Graphics.brightness = last_brightness Graphics.frame_reset end bitmaps end #-------------------------------------------------------------------------- # ● マップをビットマップに変換 #-------------------------------------------------------------------------- def self.snap_map(spriteset) w = $game_map.width * 32 h = $game_map.height * 32 pad = @@padding bitmap = Bitmap.new(w + pad * 2, h + pad * 2) ((w + Graphics.width - 1) / Graphics.width).times do |x| x *= Graphics.width ((h + Graphics.height - 1) / Graphics.height).times do |y| y *= Graphics.height $game_map.set_pos(x / 32.0, y / 32.0) spriteset.refresh_tilemap snap = Graphics.snap_to_bitmap bitmap.blt(x + pad, y + pad, snap, snap.rect) snap.dispose end end bitmap.blt(pad, 0, bitmap, Rect.new(pad, h, w, pad)) bitmap.blt(pad, pad + h, bitmap, Rect.new(pad, pad, w, pad)) bitmap.blt(0, 0, bitmap, Rect.new(w, 0, pad, h + pad * 2)) bitmap.blt(pad + w, 0, bitmap, Rect.new(pad, 0, pad, h + pad * 2)) bitmap end #-------------------------------------------------------------------------- # ● 余白の取得 #-------------------------------------------------------------------------- def self.padding @@padding end end module Veh3D def self.max_view_zoom @data.values.max_by {|val| val[:view_zoom] || 1 }[:view_zoom] || 1 end end @cache ||= {} def self.load_map(map_id) keyname = sprintf("TilemapBitmaps/%03d", map_id) if @cache.include?(keyname) && @cache[keyname].any? {|bm| bm.disposed? } @cache.delete(keyname) end @cache[keyname] end def self.save_map(map_id, bitmaps) keyname = sprintf("TilemapBitmaps/%03d", map_id) @cache[keyname] = bitmaps end def self.delete_map(map_id) keyname = sprintf("TilemapBitmaps/%03d", map_id) @cache.delete(keyname) end @material << :Veh3D_OP2 end #============================================================================== # ■ DataManager #============================================================================== class << DataManager #-------------------------------------------------------------------------- # ◯ モジュール初期化 #-------------------------------------------------------------------------- alias _wdtk_veh3d_op2_init init def init _wdtk_veh3d_op2_init WdTk::Veh3D::OP2.init end end #============================================================================== # ■ Game_Vehicle #============================================================================== class Game_Vehicle #-------------------------------------------------------------------------- # ○ 視界距離の取得 #-------------------------------------------------------------------------- alias _wdtk_veh3d_op2_view_distance view_distance def view_distance _wdtk_veh3d_op2_view_distance * view_zoom end #-------------------------------------------------------------------------- # ○ 画面中央の座標 #-------------------------------------------------------------------------- alias _wdtk_veh3d_op2_center_x center_x def center_x _wdtk_veh3d_op2_center_x * view_zoom end alias _wdtk_veh3d_op2_center_y center_y def center_y _wdtk_veh3d_op2_center_y * view_zoom end #-------------------------------------------------------------------------- # ☆ スナップ距離の取得 #-------------------------------------------------------------------------- def snap_distance _wdtk_veh3d_op2_view_distance * 32 - 8 end #-------------------------------------------------------------------------- # ☆ 原点 Y 座標の計算 #-------------------------------------------------------------------------- def adjust_height(s) 318 + s - (@altitude / 10.0 / view_zoom) end #-------------------------------------------------------------------------- # ● 視界拡大率の取得 #-------------------------------------------------------------------------- def view_zoom param(:view_zoom) || 1.0 end end #============================================================================== # ■ Sprite_Vehicle #============================================================================== class Sprite_Vehicle #-------------------------------------------------------------------------- # ○ 影の更新 #-------------------------------------------------------------------------- alias _wdtk_veh3d_op2_update_shadow update_shadow def update_shadow _wdtk_veh3d_op2_update_shadow if @character.flight? @shadow_sprite.zoom_x /= @character.view_zoom @shadow_sprite.zoom_y = @shadow_sprite.zoom_x end end end #============================================================================== # ■ Spriteset_Map #============================================================================== class Spriteset_Map #-------------------------------------------------------------------------- # ● タイルマップのリフレッシュ #-------------------------------------------------------------------------- def refresh_tilemap @tilemap.ox = $game_map.display_x * 32 @tilemap.oy = $game_map.display_y * 32 @parallax.ox = $game_map.parallax_ox(@parallax.bitmap) @parallax.oy = $game_map.parallax_oy(@parallax.bitmap) @character_sprites.each {|sprite| sprite.update_position } end #-------------------------------------------------------------------------- # ● 撮影用にビューポートの表示状態を切り替える #-------------------------------------------------------------------------- def snap_viewport @viewport1.visible = true @viewport2.visible = @viewport3.visible = false end #-------------------------------------------------------------------------- # ● 非表示にする #-------------------------------------------------------------------------- def hide @viewport1.visible = @viewport2.visible = @viewport3.visible = false end #-------------------------------------------------------------------------- # ● 撮影しないキャラクターの削除 #-------------------------------------------------------------------------- def select_characters @character_sprites.reject! do |sprite| case sprite.character when Game_Event sprite.dispose unless WdTk::Veh3D::OP2::ShowEvent when Game_Vehicle sprite.dispose unless WdTk::Veh3D::OP2::ShowVehic else sprite.dispose end sprite.disposed? end end #-------------------------------------------------------------------------- # ◯ フレーム更新 #-------------------------------------------------------------------------- alias _wdtk_veh3d_op2_update update def update _wdtk_veh3d_op2_update update_tilemap_bitmaps end #-------------------------------------------------------------------------- # ● タイルマップのビットマップの更新 #-------------------------------------------------------------------------- def update_tilemap_bitmaps end end #============================================================================== # ■ Spriteset_Vehicle #============================================================================== class Spriteset_Vehicle < Spriteset_Map #-------------------------------------------------------------------------- # ◯ オブジェクト初期化 #-------------------------------------------------------------------------- alias _wdtk_veh3d_op2_initialize initialize def initialize(viewport) @map_pattern = 0 @anime_count = 0 _wdtk_veh3d_op2_initialize(viewport) end #-------------------------------------------------------------------------- # ● 撮影用にビューポートの表示状態を切り替える #-------------------------------------------------------------------------- def snap_viewport @veh_viewport0.visible = @veh_viewport4.visible = false @scenery.visible = false super end #-------------------------------------------------------------------------- # ◯ キャラクタースプライトの作成 #-------------------------------------------------------------------------- alias _wdtk_veh3d_op2_create_characters create_characters def create_characters _wdtk_veh3d_op2_create_characters select_characters end #-------------------------------------------------------------------------- # ◯ 解放 #-------------------------------------------------------------------------- alias _wdtk_veh3d_op2_dispose dispose def dispose _wdtk_veh3d_op2_dispose dispose_map_bitmaps end #-------------------------------------------------------------------------- # ● マップビットマップの解放 #-------------------------------------------------------------------------- def dispose_map_bitmaps return unless SceneManager.scene_is?(Scene_Map) return if WdTk::Veh3D::OP2::MapCache return if WdTk::Veh3D::OP2::SetupMap.include?(@bitmap_map_id) WdTk.delete_map(@bitmap_map_id) end #-------------------------------------------------------------------------- # ● タイルマップのビットマップの更新 #-------------------------------------------------------------------------- def update_tilemap_bitmaps if @bitmap_map_id != $game_map.map_id @bitmap_map_id = $game_map.map_id dispose_map_bitmaps if @map_bitmaps @map_bitmaps = WdTk::Veh3D::OP2.create_map(@bitmap_map_id, self) end end #-------------------------------------------------------------------------- # ☆ スナップの撮影 #-------------------------------------------------------------------------- def on_snap @anime_count += 1 if @anime_count >= 30 @anime_count = 0 @map_pattern = (@map_pattern + 1) % 4 end pattern = @map_pattern < 3 ? @map_pattern : 1 @snap_sprite.bitmap = @map_bitmaps[pattern] || @map_bitmaps[0] end #-------------------------------------------------------------------------- # ☆ スナップの更新 #-------------------------------------------------------------------------- def update_snap sx = $game_map.display_x * 32 + WdTk::Veh3D::OP2.padding sy = $game_map.display_y * 32 + WdTk::Veh3D::OP2.padding gh = Graphics.height * @vehicle.view_zoom gx = (Graphics.width * @vehicle.view_zoom - gh) / 2 @snap_sprite.src_rect.set(sx + gx, sy, gh, gh) @snap_sprite.ox = @vehicle.snap_ox - gx @snap_sprite.oy = @vehicle.snap_oy @snap_sprite.angle = -@vehicle.angle @snap_sprite.zoom_x = @snap_sprite.zoom_y = 1 / @vehicle.view_zoom end end