Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # coding: utf-8
- # ===========================================================================
- # ★ WF-RGSS Scripts ★
- # XPMAP-EX XPマップスクリプト
- # バージョン : rev-1.8 (2013-5-11)
- # 作者 : A Crying Minister (WHITE-FLUTE)
- # サポート先URI: http://www.whiteflute.org/wfrgss/
- # ---------------------------------------------------------------------------
- # 機能:
- # RPGツクールXPのマップをRPGツクールVXAceで読み込めるようにします。
- # ---------------------------------------------------------------------------
- # 設置場所 :素材箇所に設置(素材箇所の出来る限り上に設置)
- # ※ただし、VGA-Sizeより下
- # 必要スクリプト:
- # ・共通スクリプト(rev-26以降)、Exit-EX 終了処理スクリプト
- # 注意事項:
- # ▽ このスクリプトはスクリプトにある程度慣れた玄人向けです。
- # ▽ このスクリプトは、RPGツクール(R)VXAce用です。
- # RPGツクール(R)XP/VXには対応していません。
- # ▽ このスクリプトを使用するには、RPGツクールXPおよびRPGツクールVXAceの
- # 両方のユーザである必要があります。
- # ▽ スクリプトの性質上、VGAサイズで起動する必要があります。
- # ▽ XPのイベントコマンド スクリプトはVXAceでそのまま使えるとは限りません。
- # (そのままでは使えない可能性が高いです。)
- # VXAce用に書く必要がございます。
- # ===========================================================================
- module WFRGSS_XPMap
- # --------------------------------------------------------------------------
- # ■ オートタイルアニメーションのフレームレート(負数:更新しない)
- #
- ANIME_RATE = 15
- # --------------------------------------------------------------------------
- # ■ 更新に同期を取るかどうか。
- # 取ると低速ですが、ちらつきが無くなります。
- # 取らないとちらつきますが、高速に描けます。
- # CPUパワーが十分ある環境の場合 true にすべきです。
- #
- FORCE_REFRESH = true
- # --------------------------------------------------------------------------
- # ■ Nothing class (don't edit)
- Nothing = Struct.new(:update, :dispose)
- # ---------------------------------------------------------------------------
- # ■ 設定完了
- # ===========================================================================
- end
- #==============================================================================
- # ■ XPTilemap
- #------------------------------------------------------------------------------
- # XPのタイルマップの再現クラスです。
- #==============================================================================
- class XPTilemap
- #--------------------------------------------------------------------------
- # ● 定数
- #--------------------------------------------------------------------------
- BITMAP_HEIGHT = [480,64,96,128,160,192,192,224,224,224,224,224,
- 224,224,224,224,192,160,128, 96, 64].freeze
- BITMAP_ADJAST_Y = [0, 0, 0, 0, 0, 0, 0, 0, 32, 64, 96,128,160,192,
- 224,256,288,320,352,384,416].freeze
- #--------------------------------------------------------------------------
- # ● クラス変数
- #--------------------------------------------------------------------------
- begin
- @@setup = Win32API.new('wfXPTilemap','setupTileMap','v','i').freeze
- @@dispose = Win32API.new('wfXPTilemap','dispose','v','v').freeze
- @@maketile = Win32API.new('wfXPTilemap','makeTilesetSetup','ip','l').freeze
- @@draw = Win32API.new('wfXPTilemap','drawTileMap','iilpi','v').freeze
- # 同期設定
- Win32API.new('wfXPTilemap','refreshChanges','i','v').call(
- WFRGSS_XPMap::FORCE_REFRESH ? 1 : 0)
- @@tileset_id = 0
- rescue Exception
- #raise if debug?
- raise(LoadError,"cannot read modules.(wfXPTilemap.dll)")
- end
- #--------------------------------------------------------------------------
- # ● 公開インスタンス変数
- #--------------------------------------------------------------------------
- attr_reader :viewport, :ox, :oy
- attr_accessor :tileset # Used to bypass dispose error in Spriteset_Map
- attr_accessor :autotiles # Used to bypass dispose error in Spriteset_Map
- #--------------------------------------------------------------------------
- # ● タイルマップ機能初期化 ※ゲーム開始時に読み込む
- #--------------------------------------------------------------------------
- def self.setup
- @@setup.call()
- @@tileset_id = -1
- end
- #--------------------------------------------------------------------------
- # ● タイルマップ機能解放 ※ゲーム終了時に読み込む
- #--------------------------------------------------------------------------
- def self.dispose
- @@dispose.call()
- end
- #--------------------------------------------------------------------------
- # ● オブジェクト初期化
- #--------------------------------------------------------------------------
- def initialize(viewport)
- @viewport = viewport
- @sprites = Array.new(21){ Sprite.new(@viewport) }
- 21.times do |i|
- @sprites.at(i).bitmap = Bitmap.new(640,BITMAP_HEIGHT.at(i))
- @sprites.at(i).z = (i + 1) * 32
- @sprites.at(i).x = 0
- @sprites.at(i).y = BITMAP_ADJAST_Y.at(i)
- end
- @sprites.first.z = 0
- @ox = nil
- @oy = nil
- @changed = true
- @force_changed = true # 強制復帰フラグ
- @bitmap_array = @sprites.collect{|s|s.bitmap.object_id}.pack("L*")
- end
- #--------------------------------------------------------------------------
- # ● セットアップ
- #--------------------------------------------------------------------------
- def setup( tilemap_id )
- return true if @@tileset_id == tilemap_id
- @@tileset_id = tilemap_id
- @force_changed = true
- @@maketile.call(@@tileset_id,make_setup_tilemap_data(@@tileset_id)).zero?
- end
- #--------------------------------------------------------------------------
- # ● 可視状態
- #--------------------------------------------------------------------------
- def visible
- @sprites && @sprites.first.visible
- end
- #--------------------------------------------------------------------------
- # ● 可視状態の更新
- #--------------------------------------------------------------------------
- def visible=(visible)
- @sprites && @sprites.each {|s| s.visible = visible ? true : false }
- end
- #--------------------------------------------------------------------------
- # ● フレーム更新
- #--------------------------------------------------------------------------
- def update
- up = check_changes_and_animations
- return unless @changed
- update_bitmaps(up)
- end
- #--------------------------------------------------------------------------
- # ● マップデータ
- #--------------------------------------------------------------------------
- def map_data
- @data
- end
- #--------------------------------------------------------------------------
- # ● マップデータ
- #--------------------------------------------------------------------------
- def map_data=(map_data)
- @data = map_data
- end
- #--------------------------------------------------------------------------
- # ● ox 更新
- #--------------------------------------------------------------------------
- def ox=(ox)
- oxa = ox.to_i
- return if @ox == oxa
- @ox = oxa
- @changed = true
- end
- #--------------------------------------------------------------------------
- # ● oy 更新
- #--------------------------------------------------------------------------
- def oy=(oy)
- oya = oy.to_i
- return if @oy == oya
- @oy = oya
- @changed = true
- end
- #--------------------------------------------------------------------------
- # ● 解放
- #--------------------------------------------------------------------------
- def dispose
- if @sprites
- @sprites.each { |s| s.dispose }
- @sprites = nil
- end
- end
- #--------------------------------------------------------------------------
- # ● 解放されたか
- #--------------------------------------------------------------------------
- def disposed?
- !@sprites
- end
- private
- #--------------------------------------------------------------------------
- # ◆(内部専用)◆ タイルマップデータ作成
- #--------------------------------------------------------------------------
- def make_setup_tilemap_data( tileset_id )
- @tilemap = $data_tilesets.at(tileset_id)
- tile_bitmap = RPG::Cache.tileset(@tilemap.tileset_name)
- autotile = Array.new(7)
- @tilemap.autotile_names.each_with_index do | name , i |
- autotile[i] = RPG::Cache.autotile(name) unless name.empty?
- end
- [ tile_bitmap.object_id , autotile[0].object_id ,
- autotile[1].object_id , autotile[2].object_id ,
- autotile[3].object_id , autotile[4].object_id ,
- autotile[5].object_id , autotile[6].object_id ,
- tile_bitmap.width ,autotile[0].width , autotile[1].width,
- autotile[2].width ,autotile[3].width , autotile[4].width,
- autotile[5].width ,autotile[6].width,
- tile_bitmap.height ,autotile[0].height ,autotile[1].height ,
- autotile[2].height ,autotile[3].height ,autotile[4].height ,
- autotile[5].height ,autotile[6].height ,
- @tilemap.priorities.object_id ].pack("L*")
- end
- #--------------------------------------------------------------------------
- # ◆(内部専用)◆ 更新をチェック
- #--------------------------------------------------------------------------
- def check_changes_and_animations
- if @force_changed
- @force_changed = false
- @changed = true
- return true
- end
- return false unless WFRGSS_XPMap::ANIME_RATE > 0
- return false unless Graphics.frame_count % WFRGSS_XPMap::ANIME_RATE == 0
- @changed = true
- true
- end
- #--------------------------------------------------------------------------
- # ◆(内部専用)◆ 描画
- #--------------------------------------------------------------------------
- def update_bitmaps(up)
- @@draw.call(@ox,@oy,$game_map.data.object_id, @bitmap_array,up ? 1 : 0)
- @changed = false
- end
- end
- #==============================================================================
- # ** NilClass
- #------------------------------------------------------------------------------
- # This class is used to define nil object
- #==============================================================================
- class NilClass
- define_method(:object_id) { |*args| 0 }
- define_method(:width) { |*args| 0 }
- define_method(:height) { |*args| 0 }
- end
- #==============================================================================
- # ** Spriteset_Map
- #------------------------------------------------------------------------------
- # This class brings together map screen sprites, tilemaps, etc.
- # It's used within the Scene_Map class.
- #==============================================================================
- class Spriteset_Map
- if !method_defined?(:create_tilemap)
- #--------------------------------------------------------------------------
- # * Object Initialization
- #--------------------------------------------------------------------------
- def initialize
- create_viewports
- create_tilemap
- create_panorama
- create_fog
- create_characters
- create_player
- create_weather
- create_pictures
- create_timer
- update
- end
- #--------------------------------------------------------------------------
- # * Viewport Initialization
- #--------------------------------------------------------------------------
- def create_viewports
- # Make viewports
- @viewport1 = Viewport.new(0, 0, 640, 480)
- @viewport2 = Viewport.new(0, 0, 640, 480)
- @viewport3 = Viewport.new(0, 0, 640, 480)
- @viewport2.z = 200
- @viewport3.z = 5000
- end
- #--------------------------------------------------------------------------
- # * Panorama Initialization
- #--------------------------------------------------------------------------
- def create_panorama
- # Make panorama plane
- @panorama = Plane.new(@viewport1)
- @panorama.z = -1000
- end
- #--------------------------------------------------------------------------
- # * Fog Initialization
- #--------------------------------------------------------------------------
- def create_fog
- # Make fog plane
- @fog = Plane.new(@viewport1)
- @fog.z = 3000
- end
- #--------------------------------------------------------------------------
- # * Character Sprite Initialization
- #--------------------------------------------------------------------------
- def create_characters
- # Make character sprites
- @character_sprites = []
- for i in $game_map.events.keys.sort
- sprite = Sprite_Character.new(@viewport1, $game_map.events[i])
- @character_sprites.push(sprite)
- end
- end
- #--------------------------------------------------------------------------
- # * Player Initialization
- #--------------------------------------------------------------------------
- def create_player
- @character_sprites.push(Sprite_Character.new(@viewport1, $game_player))
- end
- #--------------------------------------------------------------------------
- # * Weather Initialization
- #--------------------------------------------------------------------------
- def create_weather
- # Make weather
- @weather = RPG::Weather.new(@viewport1)
- end
- #--------------------------------------------------------------------------
- # * Picture Initialization
- #--------------------------------------------------------------------------
- def create_pictures
- # Make picture sprites
- @picture_sprites = []
- for i in 1..50
- @picture_sprites.push(Sprite_Picture.new(@viewport2,
- $game_screen.pictures[i]))
- end
- end
- #--------------------------------------------------------------------------
- # * Timer Initialization
- #--------------------------------------------------------------------------
- def create_timer
- # Make timer sprite
- @timer_sprite = Sprite_Timer.new
- end
- end
- #--------------------------------------------------------------------------
- # * Tilemap Initialization
- #--------------------------------------------------------------------------
- def create_tilemap
- # Make tilemap
- tileset_id = $game_map.instance_variable_get(:@map).tileset_id
- @tilemap = XPTilemap.new(@viewport1)
- @tileset = $data_tilesets.at(tileset_id)
- @tilemap.map_data = $game_map.data
- @tilemap.setup(@tileset.id)
- @tilemap.tileset = WFRGSS_XPMap::Nothing.new # Replaced to nothing
- @tilemap.autotiles = [WFRGSS_XPMap::Nothing.new]*7 # Replaced to nothing
- end
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement