LiTTleDRAgo

[RGSS] WF-RGSS's Tilemap (bugged)

Jul 28th, 2013
283
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. # coding: utf-8
  2. # ===========================================================================
  3. # ★ WF-RGSS Scripts ★
  4. #    XPMAP-EX XPマップスクリプト
  5. # バージョン   : rev-1.8 (2013-5-11)
  6. # 作者         : A Crying Minister (WHITE-FLUTE)
  7. # サポート先URI: http://www.whiteflute.org/wfrgss/
  8. # ---------------------------------------------------------------------------
  9. # 機能:
  10. #    RPGツクールXPのマップをRPGツクールVXAceで読み込めるようにします。
  11. # ---------------------------------------------------------------------------
  12. # 設置場所     :素材箇所に設置(素材箇所の出来る限り上に設置)
  13. #                ※ただし、VGA-Sizeより下
  14. # 必要スクリプト:
  15. # ・共通スクリプト(rev-26以降)、Exit-EX 終了処理スクリプト
  16. # 注意事項:
  17. #   ▽ このスクリプトはスクリプトにある程度慣れた玄人向けです。
  18. #   ▽ このスクリプトは、RPGツクール(R)VXAce用です。
  19. #      RPGツクール(R)XP/VXには対応していません。
  20. #   ▽ このスクリプトを使用するには、RPGツクールXPおよびRPGツクールVXAceの
  21. #      両方のユーザである必要があります。
  22. #   ▽ スクリプトの性質上、VGAサイズで起動する必要があります。
  23. #   ▽ XPのイベントコマンド スクリプトはVXAceでそのまま使えるとは限りません。
  24. #      (そのままでは使えない可能性が高いです。)
  25. #     VXAce用に書く必要がございます。
  26. # ===========================================================================
  27.  
  28. module WFRGSS_XPMap
  29.   # --------------------------------------------------------------------------
  30.   # ■ オートタイルアニメーションのフレームレート(負数:更新しない)
  31.   #
  32.   ANIME_RATE = 15
  33.  
  34.  
  35.   # --------------------------------------------------------------------------
  36.   # ■ 更新に同期を取るかどうか。
  37.   # 取ると低速ですが、ちらつきが無くなります。
  38.   # 取らないとちらつきますが、高速に描けます。
  39.   # CPUパワーが十分ある環境の場合 true にすべきです。
  40.   #
  41.   FORCE_REFRESH = true
  42.  
  43.  
  44.   # --------------------------------------------------------------------------
  45.   # ■ Nothing class (don't edit)
  46.   Nothing = Struct.new(:update, :dispose)
  47.   # ---------------------------------------------------------------------------
  48.   # ■ 設定完了
  49.   # ===========================================================================
  50. end
  51.  
  52. #==============================================================================
  53. # ■ XPTilemap
  54. #------------------------------------------------------------------------------
  55. #  XPのタイルマップの再現クラスです。
  56. #==============================================================================
  57. class XPTilemap
  58.   #--------------------------------------------------------------------------
  59.   # ● 定数
  60.   #--------------------------------------------------------------------------
  61.   BITMAP_HEIGHT = [480,64,96,128,160,192,192,224,224,224,224,224,
  62.                    224,224,224,224,192,160,128, 96, 64].freeze
  63.   BITMAP_ADJAST_Y = [0, 0, 0,  0,  0,  0,  0,  0, 32, 64, 96,128,160,192,
  64.                      224,256,288,320,352,384,416].freeze  
  65.   #--------------------------------------------------------------------------
  66.   # ● クラス変数
  67.   #--------------------------------------------------------------------------
  68.   begin
  69.     @@setup = Win32API.new('wfXPTilemap','setupTileMap','v','i').freeze
  70.     @@dispose = Win32API.new('wfXPTilemap','dispose','v','v').freeze
  71.     @@maketile = Win32API.new('wfXPTilemap','makeTilesetSetup','ip','l').freeze
  72.     @@draw = Win32API.new('wfXPTilemap','drawTileMap','iilpi','v').freeze
  73.     # 同期設定
  74.     Win32API.new('wfXPTilemap','refreshChanges','i','v').call(
  75.                  WFRGSS_XPMap::FORCE_REFRESH ? 1 : 0)
  76.     @@tileset_id = 0
  77.   rescue Exception
  78.     #raise if debug?
  79.     raise(LoadError,"cannot read modules.(wfXPTilemap.dll)")
  80.   end
  81.   #--------------------------------------------------------------------------
  82.   # ● 公開インスタンス変数
  83.   #--------------------------------------------------------------------------
  84.   attr_reader :viewport, :ox, :oy
  85.   attr_accessor :tileset    # Used to bypass dispose error in Spriteset_Map
  86.   attr_accessor :autotiles  # Used to bypass dispose error in Spriteset_Map
  87.   #--------------------------------------------------------------------------
  88.   # ● タイルマップ機能初期化 ※ゲーム開始時に読み込む
  89.   #--------------------------------------------------------------------------
  90.   def self.setup
  91.     @@setup.call()
  92.     @@tileset_id = -1
  93.   end
  94.   #--------------------------------------------------------------------------
  95.   # ● タイルマップ機能解放 ※ゲーム終了時に読み込む
  96.   #--------------------------------------------------------------------------
  97.   def self.dispose
  98.     @@dispose.call()
  99.   end
  100.   #--------------------------------------------------------------------------
  101.   # ● オブジェクト初期化
  102.   #--------------------------------------------------------------------------
  103.   def initialize(viewport)
  104.     @viewport = viewport
  105.     @sprites = Array.new(21){ Sprite.new(@viewport) }
  106.     21.times do |i|
  107.       @sprites.at(i).bitmap = Bitmap.new(640,BITMAP_HEIGHT.at(i))
  108.       @sprites.at(i).z = (i + 1) * 32
  109.       @sprites.at(i).x = 0
  110.       @sprites.at(i).y = BITMAP_ADJAST_Y.at(i)
  111.     end
  112.     @sprites.first.z = 0
  113.     @ox = nil
  114.     @oy = nil
  115.     @changed = true
  116.     @force_changed = true # 強制復帰フラグ
  117.     @bitmap_array = @sprites.collect{|s|s.bitmap.object_id}.pack("L*")
  118.   end
  119.   #--------------------------------------------------------------------------
  120.   # ● セットアップ
  121.   #--------------------------------------------------------------------------
  122.   def setup( tilemap_id )
  123.     return true if @@tileset_id == tilemap_id
  124.     @@tileset_id = tilemap_id
  125.     @force_changed = true
  126.     @@maketile.call(@@tileset_id,make_setup_tilemap_data(@@tileset_id)).zero?
  127.   end
  128.   #--------------------------------------------------------------------------
  129.   # ● 可視状態
  130.   #--------------------------------------------------------------------------
  131.   def visible
  132.     @sprites && @sprites.first.visible
  133.   end
  134.   #--------------------------------------------------------------------------
  135.   # ● 可視状態の更新
  136.   #--------------------------------------------------------------------------
  137.   def visible=(visible)
  138.     @sprites && @sprites.each {|s| s.visible = visible ? true : false }
  139.   end  
  140.   #--------------------------------------------------------------------------
  141.   # ● フレーム更新
  142.   #--------------------------------------------------------------------------
  143.   def update
  144.     up = check_changes_and_animations
  145.     return unless @changed
  146.     update_bitmaps(up)
  147.   end
  148.   #--------------------------------------------------------------------------
  149.   # ● マップデータ
  150.   #--------------------------------------------------------------------------
  151.   def map_data
  152.     @data
  153.   end
  154.   #--------------------------------------------------------------------------
  155.   # ● マップデータ
  156.   #--------------------------------------------------------------------------
  157.   def map_data=(map_data)
  158.     @data = map_data
  159.   end
  160.   #--------------------------------------------------------------------------
  161.   # ● ox 更新
  162.   #--------------------------------------------------------------------------
  163.   def ox=(ox)
  164.     oxa = ox.to_i
  165.     return if @ox == oxa
  166.     @ox = oxa
  167.     @changed = true
  168.   end
  169.   #--------------------------------------------------------------------------
  170.   # ● oy 更新
  171.   #--------------------------------------------------------------------------
  172.   def oy=(oy)
  173.     oya = oy.to_i
  174.     return if @oy == oya
  175.     @oy = oya
  176.     @changed = true
  177.   end
  178.   #--------------------------------------------------------------------------
  179.   # ● 解放
  180.   #--------------------------------------------------------------------------
  181.   def dispose
  182.     if @sprites
  183.       @sprites.each { |s|  s.dispose }
  184.       @sprites = nil
  185.     end
  186.   end
  187.   #--------------------------------------------------------------------------
  188.   # ● 解放されたか
  189.   #--------------------------------------------------------------------------
  190.   def disposed?
  191.     !@sprites
  192.   end
  193.   private
  194.   #--------------------------------------------------------------------------
  195.   # ◆(内部専用)◆ タイルマップデータ作成
  196.   #--------------------------------------------------------------------------
  197.   def make_setup_tilemap_data( tileset_id )
  198.     @tilemap = $data_tilesets.at(tileset_id)
  199.     tile_bitmap = RPG::Cache.tileset(@tilemap.tileset_name)
  200.     autotile = Array.new(7)
  201.     @tilemap.autotile_names.each_with_index do | name , i |
  202.       autotile[i] = RPG::Cache.autotile(name) unless name.empty?
  203.     end
  204.     [ tile_bitmap.object_id , autotile[0].object_id ,
  205.       autotile[1].object_id , autotile[2].object_id ,
  206.       autotile[3].object_id , autotile[4].object_id ,
  207.       autotile[5].object_id , autotile[6].object_id ,
  208.       tile_bitmap.width ,autotile[0].width , autotile[1].width,
  209.       autotile[2].width ,autotile[3].width , autotile[4].width,
  210.       autotile[5].width ,autotile[6].width,
  211.       tile_bitmap.height ,autotile[0].height ,autotile[1].height ,
  212.       autotile[2].height ,autotile[3].height ,autotile[4].height ,
  213.       autotile[5].height ,autotile[6].height ,
  214.       @tilemap.priorities.object_id ].pack("L*")
  215.   end
  216.   #--------------------------------------------------------------------------
  217.   # ◆(内部専用)◆ 更新をチェック
  218.   #--------------------------------------------------------------------------
  219.   def check_changes_and_animations
  220.     if @force_changed
  221.       @force_changed = false
  222.       @changed = true
  223.       return true
  224.     end
  225.     return false unless WFRGSS_XPMap::ANIME_RATE > 0
  226.     return false unless Graphics.frame_count % WFRGSS_XPMap::ANIME_RATE == 0
  227.     @changed = true
  228.     true
  229.   end
  230.   #--------------------------------------------------------------------------
  231.   # ◆(内部専用)◆ 描画
  232.   #--------------------------------------------------------------------------
  233.   def update_bitmaps(up)
  234.     @@draw.call(@ox,@oy,$game_map.data.object_id, @bitmap_array,up ? 1 : 0)
  235.     @changed = false
  236.   end
  237. end
  238.  
  239.  
  240. #==============================================================================
  241. # ** NilClass
  242. #------------------------------------------------------------------------------
  243. #  This class is used to define nil object
  244. #==============================================================================
  245. class NilClass
  246.   define_method(:object_id) { |*args| 0 }
  247.   define_method(:width)     { |*args| 0 }
  248.   define_method(:height)    { |*args| 0 }
  249. end
  250.  
  251. #==============================================================================
  252. # ** Spriteset_Map
  253. #------------------------------------------------------------------------------
  254. #  This class brings together map screen sprites, tilemaps, etc.
  255. #  It's used within the Scene_Map class.
  256. #==============================================================================
  257. class Spriteset_Map
  258.   if !method_defined?(:create_tilemap)
  259.     #--------------------------------------------------------------------------
  260.     # * Object Initialization
  261.     #--------------------------------------------------------------------------
  262.     def initialize
  263.       create_viewports
  264.       create_tilemap
  265.       create_panorama
  266.       create_fog
  267.       create_characters
  268.       create_player
  269.       create_weather
  270.       create_pictures
  271.       create_timer
  272.       update
  273.     end
  274.     #--------------------------------------------------------------------------
  275.     # * Viewport Initialization
  276.     #--------------------------------------------------------------------------
  277.     def create_viewports
  278.       # Make viewports
  279.       @viewport1 = Viewport.new(0, 0, 640, 480)
  280.       @viewport2 = Viewport.new(0, 0, 640, 480)
  281.       @viewport3 = Viewport.new(0, 0, 640, 480)
  282.       @viewport2.z = 200
  283.       @viewport3.z = 5000
  284.     end
  285.     #--------------------------------------------------------------------------
  286.     # * Panorama Initialization
  287.     #--------------------------------------------------------------------------
  288.     def create_panorama
  289.       # Make panorama plane
  290.       @panorama = Plane.new(@viewport1)
  291.       @panorama.z = -1000
  292.     end
  293.     #--------------------------------------------------------------------------
  294.     # * Fog Initialization
  295.     #--------------------------------------------------------------------------
  296.     def create_fog
  297.       # Make fog plane
  298.       @fog = Plane.new(@viewport1)
  299.       @fog.z = 3000
  300.     end
  301.     #--------------------------------------------------------------------------
  302.     # * Character Sprite Initialization
  303.     #--------------------------------------------------------------------------
  304.     def create_characters
  305.       # Make character sprites
  306.       @character_sprites = []
  307.       for i in $game_map.events.keys.sort
  308.         sprite = Sprite_Character.new(@viewport1, $game_map.events[i])
  309.         @character_sprites.push(sprite)
  310.       end
  311.     end
  312.     #--------------------------------------------------------------------------
  313.     # * Player Initialization
  314.     #--------------------------------------------------------------------------
  315.     def create_player
  316.       @character_sprites.push(Sprite_Character.new(@viewport1, $game_player))
  317.     end
  318.     #--------------------------------------------------------------------------
  319.     # * Weather Initialization
  320.     #--------------------------------------------------------------------------
  321.     def create_weather
  322.       # Make weather
  323.       @weather = RPG::Weather.new(@viewport1)
  324.     end
  325.     #--------------------------------------------------------------------------
  326.     # * Picture Initialization
  327.     #--------------------------------------------------------------------------
  328.     def create_pictures
  329.       # Make picture sprites
  330.       @picture_sprites = []
  331.       for i in 1..50
  332.         @picture_sprites.push(Sprite_Picture.new(@viewport2,
  333.           $game_screen.pictures[i]))
  334.       end
  335.     end
  336.     #--------------------------------------------------------------------------
  337.     # * Timer Initialization
  338.     #--------------------------------------------------------------------------
  339.     def create_timer
  340.       # Make timer sprite
  341.       @timer_sprite = Sprite_Timer.new
  342.     end
  343.   end
  344.   #--------------------------------------------------------------------------
  345.   # * Tilemap Initialization
  346.   #--------------------------------------------------------------------------
  347.   def create_tilemap
  348.     # Make tilemap
  349.     tileset_id = $game_map.instance_variable_get(:@map).tileset_id
  350.     @tilemap = XPTilemap.new(@viewport1)
  351.     @tileset = $data_tilesets.at(tileset_id)
  352.     @tilemap.map_data = $game_map.data
  353.     @tilemap.setup(@tileset.id)
  354.     @tilemap.tileset = WFRGSS_XPMap::Nothing.new       # Replaced to nothing
  355.     @tilemap.autotiles = [WFRGSS_XPMap::Nothing.new]*7 # Replaced to nothing
  356.   end
  357. end
RAW Paste Data