SHARE
TWEET

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

LiTTleDRAgo Jul 28th, 2013 208 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
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
Top