设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 1332|回复: 2
打印 上一主题 下一主题

[已经解决] 想问问一些关于地图截图的问题。

[复制链接]

Lv3.寻梦者

梦石
0
星屑
3176
在线时间
1442 小时
注册时间
2009-7-27
帖子
1454
跳转到指定楼层
1
发表于 2012-8-21 08:39:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请问我在画图时有没有办法截取全部的图片?也就是整张画好的地图截起。
而不是缩小了再截,这样效果不好。请问各位大虾能明白我的意思吗?

博客:我的博客

Lv4.逐梦者

梦石
1
星屑
10061
在线时间
4430 小时
注册时间
2005-10-22
帖子
6955

开拓者贵宾

2
发表于 2012-8-21 08:45:55 | 只看该作者

bitmap = NEOLITHIC_API::InitializeSuperBigBMP($game_map.width*32,$game_map.height*32)
for x in 0..$game_map.width
for y in 0..$game_map.height
for z in 0..2
   num = $game_map.data[x,y,z]
   if(num < 384)
     bitmap.DrawCurrentAutotile(x*32,y*32,num)
   else
     bitmap.DrawCurrentTile(x*32,y*32,num)
   end
end
end
end
bitmap.OutputAsPNG("weeeeeeeeeeee")

楼下负责翻译成人话

点评

日。。你是谁 =。= 匿名呢?***呢  发表于 2012-8-21 11:21
最少也要告诉我用法嘛  发表于 2012-8-21 09:48
回复

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
3039
在线时间
1052 小时
注册时间
2011-8-16
帖子
242
3
发表于 2012-9-1 14:16:39 | 只看该作者
插入此脚本,运行游戏,按下F6截取主角所在地图的全图

  1.     #==============================================================================
  2.     # ** Map Screenshot
  3.     #==============================================================================
  4.     #
  5.     # - Credits: Cycleby for Bitmap to PNG
  6.     #            SephirothSpawn for Tilemap
  7.     #
  8.     #
  9.     # To take a screenshot simply be on the map and press F6. The file will be
  10.     # created in your game directory under the maps name.
  11.     #
  12.     #==============================================================================


  13.     #==============================================================================
  14.     # ** Spriteset_Map
  15.     #==============================================================================
  16.     class Spriteset_Map
  17.       #--------------------------------------------------------------------------
  18.       # * Update
  19.       #--------------------------------------------------------------------------
  20.       alias :bit_to_png_up :update
  21.       def update
  22.         bit_to_png_up
  23.         if Input.trigger?(Input::F6)
  24.           map_infos = load_data("Data/MapInfos.rxdata")
  25.           bit = @tilemap.bitmap
  26.           exp_time = (bit.height * bit.width) * 0.00000664
  27.           string = "Taking screenshot please wait.... \n" +
  28.                   "Number of pixels: #{bit.height * bit.width} \n" +
  29.                   "Estamated time: #{exp_time} seconds."
  30.           print("#{string}")
  31.           old_time = Time.now
  32.           bit.make_png("#{map_infos[$game_map.map_id].name}")
  33.           string = "#{map_infos[$game_map.map_id].name}.png was created. \n" +
  34.                   "File size: width #{bit.width}, height #{bit.height}. \n" +
  35.                   "Time taken: #{Time.now - old_time} seconds."
  36.           print("#{string}")
  37.         end
  38.       end
  39.     end

  40.     #==============================================================================
  41.     #                        Bitmap to PNG By Cycleby
  42.     #==============================================================================
  43.     #
  44.     # Direct use of the Bitmap object.
  45.     #    bitmap_obj.make_png(name[, path])
  46.     #
  47.     # Name: Save the file name
  48.     # Path: path to save the
  49.     #
  50.     # Thanks 66, Shana, gold Guizi reminder and help!
  51.     #==============================================================================
  52.     module Zlib
  53.       class Png_File < GzipWriter
  54.         #--------------------------------------------------------------------------
  55.         # ● Main
  56.         #--------------------------------------------------------------------------
  57.         def make_png(bitmap_Fx,mode)
  58.           @mode = mode
  59.           @bitmap_Fx = bitmap_Fx
  60.           self.write(make_header)
  61.           self.write(make_ihdr)
  62.           self.write(make_idat)
  63.           self.write(make_iend)
  64.         end
  65.         #--------------------------------------------------------------------------
  66.         # ● PNG file header block
  67.         #--------------------------------------------------------------------------
  68.         def make_header
  69.           return [0x89,0x50,0x4e,0x47,0x0d,0x0a,0x1a,0x0a].pack("C*")
  70.         end
  71.         #--------------------------------------------------------------------------
  72.         # ● PNG file data block header information (IHDR)
  73.         #--------------------------------------------------------------------------
  74.         def make_ihdr
  75.           ih_size = [13].pack("N")
  76.           ih_sign = "IHDR"
  77.           ih_width = [@bitmap_Fx.width].pack("N")
  78.           ih_height = [@bitmap_Fx.height].pack("N")
  79.           ih_bit_depth = [8].pack("C")
  80.           ih_color_type = [6].pack("C")
  81.           ih_compression_method = [0].pack("C")
  82.           ih_filter_method = [0].pack("C")
  83.           ih_interlace_method = [0].pack("C")
  84.           string = ih_sign + ih_width + ih_height + ih_bit_depth + ih_color_type +
  85.                   ih_compression_method + ih_filter_method + ih_interlace_method
  86.           ih_crc = [Zlib.crc32(string)].pack("N")
  87.           return ih_size + string + ih_crc
  88.         end
  89.         #--------------------------------------------------------------------------
  90.         # ● Generated image data (IDAT)
  91.         #--------------------------------------------------------------------------
  92.         def make_idat
  93.           header = "\x49\x44\x41\x54"
  94.           case @mode # please 54 ~
  95.           when 1
  96.             data = make_bitmap_data # 1
  97.           else
  98.             data = make_bitmap_data
  99.           end
  100.           data = Zlib::Deflate.deflate(data, 8)
  101.           crc = [Zlib.crc32(header + data)].pack("N")
  102.           size = [data.length].pack("N")
  103.           return size + header + data + crc
  104.         end
  105.         #--------------------------------------------------------------------------
  106.         # ● Requests from the Bitmap object 54 to generate image data in mode 1
  107.         # (please 54 ~)
  108.         #--------------------------------------------------------------------------
  109.         def make_bitmap_data1
  110.           w = @bitmap_Fx.width
  111.           h = @bitmap_Fx.height
  112.           data = []
  113.           for y in 0...h
  114.             data.push(0)
  115.             for x in 0...w
  116.               color = @bitmap_Fx.get_pixel(x, y)
  117.               red = color.red
  118.               green = color.green
  119.               blue = color.blue
  120.               alpha = color.alpha
  121.               data.push(red)
  122.               data.push(green)
  123.               data.push(blue)
  124.               data.push(alpha)
  125.             end
  126.           end
  127.           return data.pack("C*")
  128.         end
  129.         #--------------------------------------------------------------------------
  130.         # ● Bitmap object from the image data generated in mode 0
  131.         #--------------------------------------------------------------------------
  132.         def make_bitmap_data
  133.           gz = Zlib::GzipWriter.open('hoge.gz')
  134.           t_Fx = 0
  135.           w = @bitmap_Fx.width
  136.           h = @bitmap_Fx.height
  137.           data = []
  138.           for y in 0...h
  139.             data.push(0)
  140.             for x in 0...w
  141.               t_Fx += 1
  142.               if t_Fx % 10000 == 0
  143.                 Graphics.update
  144.               end
  145.               if t_Fx % 100000 == 0
  146.                 s = data.pack("C*")
  147.                 gz.write(s)
  148.                 data.clear
  149.                 #GC.start
  150.               end
  151.               color = @bitmap_Fx.get_pixel(x, y)
  152.               red = color.red
  153.               green = color.green
  154.               blue = color.blue
  155.               alpha = color.alpha
  156.               data.push(red)
  157.               data.push(green)
  158.               data.push(blue)
  159.               data.push(alpha)
  160.             end
  161.           end
  162.           s = data.pack("C*")
  163.           gz.write(s)
  164.           gz.close   
  165.           data.clear
  166.           gz = Zlib::GzipReader.open('hoge.gz')
  167.           data = gz.read
  168.           gz.close
  169.           File.delete('hoge.gz')
  170.           return data
  171.         end
  172.         #--------------------------------------------------------------------------
  173.         # ● PNG end of the file data blocks (IEND)
  174.         #--------------------------------------------------------------------------
  175.         def make_iend
  176.           ie_size = [0].pack("N")
  177.           ie_sign = "IEND"
  178.           ie_crc = [Zlib.crc32(ie_sign)].pack("N")
  179.           return ie_size + ie_sign + ie_crc
  180.         end
  181.       end
  182.     end
  183.     #==============================================================================
  184.     # ■ Bitmap
  185.     #------------------------------------------------------------------------------
  186.     # Related to the Bitmap.
  187.     #==============================================================================
  188.     class Bitmap
  189.       #--------------------------------------------------------------------------
  190.       # ● Related
  191.       #--------------------------------------------------------------------------
  192.       def make_png(name="like", path="",mode=0)
  193.         make_dir(path) if path != ""
  194.         Zlib::Png_File.open("temp.gz") {|gz|
  195.           gz.make_png(self,mode)
  196.         }
  197.         Zlib::GzipReader.open("temp.gz") {|gz|
  198.           $read = gz.read
  199.         }
  200.         f = File.open(path + name + ".png","wb")
  201.         f.write($read)
  202.         f.close
  203.         File.delete('temp.gz')
  204.         end
  205.       #--------------------------------------------------------------------------
  206.       # ● Save the path generated
  207.       #--------------------------------------------------------------------------
  208.       def make_dir(path)
  209.         dir = path.split("/")
  210.         for i in 0...dir.size
  211.           unless dir == "."
  212.             add_dir = dir[0..i].join("/")
  213.             begin
  214.               Dir.mkdir(add_dir)
  215.             rescue
  216.             end
  217.           end
  218.         end
  219.       end
  220.     end

  221.     #==============================================================================
  222.     # ** Tilemap (Basic)
  223.     #------------------------------------------------------------------------------
  224.     # SephirothSpawn
  225.     # Version 1.0
  226.     # 2007-05-30
  227.     # SDK Version 2.2 + : Parts I & II
  228.     #------------------------------------------------------------------------------
  229.     # * Credits :
  230.     #
  231.     #  Thanks to Trickster for conversion formula for Hexidecimal to rgb.
  232.     #  Thanks to trebor777 for helping with the priority bug from the 0.9 version.
  233.     #------------------------------------------------------------------------------
  234.     # * Description :
  235.     #
  236.     #  This script was designed to re-write the default RMXP Hidden Tileset class.
  237.     #  The script has added many features and a new "Tilemap Settings" class,
  238.     #  that can be unique if you create mini-maps using this system.
  239.     #------------------------------------------------------------------------------
  240.     # * Instructions :
  241.     #
  242.     #  Place The Script Below the SDK and Above Main.
  243.     #------------------------------------------------------------------------------
  244.     # * Syntax :
  245.     #
  246.     #  Get Autotile Tile Bitmap
  247.     #    - RPG::Cache.autotile_tile(autotile_filename, tile_id[, hue[, frame_id]])
  248.     #
  249.     #      autotile_filename : Filename of autotile
  250.     #      tile_id : ID of tile (Found from RPG::Map.data)
  251.     #      hue (Optional) : Hue for tile
  252.     #      frame_id (Optional) : Frame of tile (for animated autotiles)
  253.     #
  254.     # * Tilemap Syntax
  255.     #
  256.     #  Readable Attributes :
  257.     #    - layers : Array of Sprites (or Planes)
  258.     #
  259.     #  Readable/Writable Attributes :
  260.     #    - tileset (No long required) : Bitmap for Tileset
  261.     #    - tileset_name : Name of Bitmap
  262.     #    - autotiles (No long required) : Array of Autotile Bitmaps
  263.     #    - autotiles_name : Array of Autotile Filenames
  264.     #    - map_data : 3D Table of Tile ID Data
  265.     #    - flash_data : 3D Table of Tile Flash Data
  266.     #                  (Should match tilemap_settings.flash_data)
  267.     #    - priorities : 3D Table of Tile Priorities
  268.     #    - Visible : Tilemap Visible Flag
  269.     #    - ox, oy : Tilemap layer offsets
  270.     #    - tilemap_settings : Unique Special Settings Object (See Below)
  271.     #    - refresh_autotiles : Refresh Autotiles on frame reset flag
  272.     #
  273.     # * Special Tilemap Settings
  274.     #
  275.     #  To make special settings easier to control for your game map and any other
  276.     #  special tilemap sprites you wish to create, a special class was created
  277.     #  to hold these settings. For your game tilemap, a Tilemap_Settings object
  278.     #  was created in $game_map ($game_map.tilemap_settings). It is advised to
  279.     #  modify $game_map.tilemap_settings.flash_data instead of tilemap.flash_data.
  280.     #
  281.     #  Readable/Writeable Attributes :
  282.     #    - map : RPG::Map (Not required, but for additions)
  283.     #    - is_a_plane : Boolean whether layers are Sprites or Planes
  284.     #    - tone : Tone for all layers
  285.     #    - hue : Hue for all layers
  286.     #    - zoom_x, zoom_y : Zoom factor for all layers
  287.     #    - tilesize : Tilesize displayed on map
  288.     #    - flash_data : 3D Table of flash_data
  289.     #==============================================================================

  290.     #==============================================================================
  291.     # ** Tilemap_Options
  292.     #==============================================================================

  293.     module Tilemap_Options
  294.       #--------------------------------------------------------------------------
  295.       # * Tilemap Options
  296.       #
  297.       #
  298.       #  Print Error Reports when not enough information set to tilemap
  299.       #    - Print_Error_Logs          = true or false
  300.       #
  301.       #  Number of autotiles to refresh at edge of viewport
  302.       #  Number of Frames Before Redrawing Animated Autotiles
  303.       #    - Animated_Autotiles_Frames = 16
  304.       #
  305.       #    - Viewport_Padding          = n
  306.       #
  307.       #  When maps are switch, automatically set
  308.       #  $game_map.tileset_settings.flash_data (Recommended : False unless using
  309.       #  flash_data)
  310.       #    - Autoset_Flash_data        = true or false
  311.       #
  312.       #  Duration Between Flash Data Flashes
  313.       #    - Flash_Duration            = n
  314.       #
  315.       #  Color of bitmap (Recommended to use low opacity value)
  316.       #    - Flash_Bitmap_C            = Color.new(255, 255, 255, 50)
  317.       #
  318.       #  Update Flashtiles Default Setting
  319.       #  Explanation : In the Flash Data Addition, because of lag, you may wish
  320.       #  to toggle whether flash tiles flash or not. This is the default state.
  321.       #    - Default_Update_Flashtiles = false
  322.       #--------------------------------------------------------------------------
  323.       Print_Error_Logs          = true
  324.       Animated_Autotiles_Frames = 16
  325.       Autoset_Flash_data        = true
  326.       Viewport_Padding          = 2
  327.       Flash_Duration            = 40
  328.       Flash_Bitmap_C            = Color.new(255, 255, 255, 50)
  329.       Default_Update_Flashtiles = false
  330.     end

  331.     #==============================================================================
  332.     # ** RPG::Cache
  333.     #==============================================================================
  334.     module RPG::Cache
  335.       #--------------------------------------------------------------------------
  336.       # * Auto-Tiles
  337.       #
  338.       #  Auto-Tile 48 : First Auto-Tile, Constructed of tiles 27, 28, 33, 34
  339.       #--------------------------------------------------------------------------
  340.       Autotiles = [
  341.         [[27, 28, 33, 34], [ 5, 28, 33, 34], [27,  6, 33, 34], [ 5,  6, 33, 34],
  342.         [27, 28, 33, 12], [ 5, 28, 33, 12], [27,  6, 33, 12], [ 5,  6, 33, 12]],
  343.         [[27, 28, 11, 34], [ 5, 28, 11, 34], [27,  6, 11, 34], [ 5,  6, 11, 34],
  344.         [27, 28, 11, 12], [ 5, 28, 11, 12], [27,  6, 11, 12], [ 5,  6, 11, 12]],
  345.         [[25, 26, 31, 32], [25,  6, 31, 32], [25, 26, 31, 12], [25,  6, 31, 12],
  346.         [15, 16, 21, 22], [15, 16, 21, 12], [15, 16, 11, 22], [15, 16, 11, 12]],
  347.         [[29, 30, 35, 36], [29, 30, 11, 36], [ 5, 30, 35, 36], [ 5, 30, 11, 36],
  348.         [39, 40, 45, 46], [ 5, 40, 45, 46], [39,  6, 45, 46], [ 5,  6, 45, 46]],
  349.         [[25, 30, 31, 36], [15, 16, 45, 46], [13, 14, 19, 20], [13, 14, 19, 12],
  350.         [17, 18, 23, 24], [17, 18, 11, 24], [41, 42, 47, 48], [ 5, 42, 47, 48]],
  351.         [[37, 38, 43, 44], [37,  6, 43, 44], [13, 18, 19, 24], [13, 14, 43, 44],
  352.         [37, 42, 43, 48], [17, 18, 47, 48], [13, 18, 43, 48], [ 1,  2,  7,  8]]
  353.       ]
  354.       #--------------------------------------------------------------------------
  355.       # * Autotile Cache
  356.       #
  357.       #  @autotile_cache = {
  358.       #    filename => { [autotile_id, frame_id, hue] => bitmap, ... },
  359.       #    ...
  360.       #    }
  361.       #--------------------------------------------------------------------------
  362.       @autotile_cache = {}
  363.       #--------------------------------------------------------------------------
  364.       # * Autotile Tile
  365.       #--------------------------------------------------------------------------
  366.       def self.autotile_tile(filename, tile_id, hue = 0, frame_id = nil)
  367.         # Gets Autotile Bitmap
  368.         autotile = self.autotile(filename)
  369.         # Configures Frame ID if not specified
  370.         if frame_id.nil?
  371.           # Animated Tiles
  372.           frames = autotile.width / 96
  373.           # Configures Animation Offset
  374.           fc = Graphics.frame_count / Tilemap_Options::Animated_Autotiles_Frames
  375.           frame_id = (fc) % frames * 96
  376.         end
  377.         # Creates list if already not created
  378.         @autotile_cache[filename] = {} unless @autotile_cache.has_key?(filename)
  379.         # Gets Key
  380.         key = [tile_id, frame_id, hue]
  381.         # If Key Not Found
  382.         unless @autotile_cache[filename].has_key?(key)
  383.           # Reconfigure Tile ID
  384.           tile_id %= 48
  385.           # Creates Bitmap
  386.           bitmap = Bitmap.new(32, 32)
  387.           # Collects Auto-Tile Tile Layout
  388.           tiles = Autotiles[tile_id / 8][tile_id % 8]
  389.           # Draws Auto-Tile Rects
  390.           for i in 0...4
  391.             tile_position = tiles[i] - 1
  392.             src_rect = Rect.new(tile_position % 6 * 16 + frame_id,
  393.               tile_position / 6 * 16, 16, 16)
  394.             bitmap.blt(i % 2 * 16, i / 2 * 16, autotile, src_rect)
  395.           end
  396.           # Saves Autotile to Cache
  397.           @autotile_cache[filename][key] = bitmap
  398.           # Change Hue
  399.           @autotile_cache[filename][key].hue_change(hue)
  400.         end
  401.         # Return Autotile
  402.         return @autotile_cache[filename][key]
  403.       end
  404.     end

  405.     #==============================================================================
  406.     # ** Spriteset_Map
  407.     #==============================================================================
  408.     class Spriteset_Map
  409.       #--------------------------------------------------------------------------
  410.       # * Object Initialization
  411.       #--------------------------------------------------------------------------
  412.       def initialize
  413.         # Make viewports
  414.         @viewport1 = Viewport.new(0, 0, 640, 480)
  415.         @viewport2 = Viewport.new(0, 0, 640, 480)
  416.         @viewport3 = Viewport.new(0, 0, 640, 480)
  417.         @viewport2.z = 200
  418.         @viewport3.z = 5000
  419.         # Make tilemap
  420.         # Make tilemap
  421.         @tilemap = Tilemap.new(@viewport1)
  422.         @tilemap.tileset = RPG::Cache.tileset($game_map.tileset_name)
  423.         for i in 0..6
  424.           autotile_name = $game_map.autotile_names[i]
  425.           @tilemap.autotiles[i] = RPG::Cache.autotile(autotile_name)
  426.         end
  427.         @tilemap.map_data = $game_map.data.dup
  428.         @tilemap.priorities = $game_map.priorities
  429.         # Set Tilemap Settings
  430.         @tilemap.tileset_name = $game_map.tileset_name
  431.         for i in 0..6
  432.           @tilemap.autotiles_name[i] = $game_map.autotile_names[i]
  433.         end
  434.         @tilemap.tilemap_settings = $game_map.tilemap_settings
  435.         # Setup Flash Data
  436.         @tilemap.flash_data = $game_map.tilemap_settings.flash_data
  437.         # Run Tilemap Setup
  438.         @tilemap.setup
  439.         # Make panorama plane
  440.         @panorama = Plane.new(@viewport1)
  441.         @panorama.z = -1000
  442.         # Make fog plane
  443.         @fog = Plane.new(@viewport1)
  444.         @fog.z = 3000
  445.         # Make character sprites
  446.         @character_sprites = []
  447.         for i in $game_map.events.keys.sort
  448.           sprite = Sprite_Character.new(@viewport1, $game_map.events[i])
  449.           @character_sprites.push(sprite)
  450.         end
  451.         @character_sprites.push(Sprite_Character.new(@viewport1, $game_player))
  452.         # Make weather
  453.         @weather = RPG::Weather.new(@viewport1)
  454.         # Make picture sprites
  455.         @picture_sprites = []
  456.         for i in 1..50
  457.           @picture_sprites.push(Sprite_Picture.new(@viewport2,
  458.             $game_screen.pictures[i]))
  459.         end
  460.         # Make timer sprite
  461.         @timer_sprite = Sprite_Timer.new
  462.         # Frame update
  463.         update
  464.       end
  465.     end

  466.     #==============================================================================
  467.     # ** Tilemap_Settings
  468.     #==============================================================================
  469.     class Tilemap_Settings
  470.       #--------------------------------------------------------------------------
  471.       # * Public Instance Variables
  472.       #--------------------------------------------------------------------------
  473.       attr_accessor :map
  474.       attr_accessor :is_a_plane
  475.       attr_accessor :tone
  476.       attr_accessor :hue
  477.       attr_accessor :zoom_x
  478.       attr_accessor :zoom_y
  479.       attr_accessor :tile_size
  480.       attr_accessor :flash_data
  481.       #--------------------------------------------------------------------------
  482.       # * Object Initialization
  483.       #--------------------------------------------------------------------------
  484.       def initialize(map = nil)
  485.         # Set Instance Variables
  486.         @map, @is_a_plane, @tone, @hue, @zoom_x, @zoom_y, @tile_size,
  487.           @flash_data = map, false, nil, 0, 1.0, 1.0, 32, nil
  488.       end
  489.     end

  490.     #==============================================================================
  491.     # ** Game_Map
  492.     #==============================================================================
  493.     class Game_Map
  494.       #--------------------------------------------------------------------------
  495.       # * Public Instance Variables
  496.       #--------------------------------------------------------------------------
  497.       attr_accessor :tilemap_settings
  498.       #--------------------------------------------------------------------------
  499.       # * Alias Listings
  500.       #--------------------------------------------------------------------------
  501.       alias_method :seph_tilemap_gmap_init, :initialize
  502.       #--------------------------------------------------------------------------
  503.       # * Object Initialization
  504.       #--------------------------------------------------------------------------
  505.       def initialize
  506.         # Original Initialization
  507.         seph_tilemap_gmap_init
  508.         # Create Tilemap Settings
  509.         @tilemap_settings = Tilemap_Settings.new
  510.       end
  511.       #--------------------------------------------------------------------------
  512.       # * Load Map Data
  513.       #--------------------------------------------------------------------------
  514.       def setup_load
  515.         # Reset Tilemap Flash Data
  516.         if Tilemap_Options::Autoset_Flash_data
  517.           @tilemap_settings.flash_data = Table.new(@map.width, @map.height)
  518.         end
  519.         @tilemap_settings.map = @map
  520.       end
  521.     end

  522.     #==============================================================================
  523.     # ** Tilemap
  524.     #==============================================================================
  525.     class Tilemap
  526.       #--------------------------------------------------------------------------
  527.       # * Public Instance Variables
  528.       #--------------------------------------------------------------------------
  529.       attr_reader  :layers
  530.       attr_accessor :tileset
  531.       attr_accessor :tileset_name
  532.       attr_accessor :autotiles
  533.       attr_accessor :autotiles_name
  534.       attr_accessor :map_data
  535.       attr_accessor :flash_data
  536.       attr_accessor :priorities
  537.       attr_accessor :visible
  538.       attr_accessor :ox
  539.       attr_accessor :oy
  540.       attr_accessor :tilemap_settings
  541.       attr_accessor :refresh_autotiles
  542.       #--------------------------------------------------------------------------
  543.       # * Object Initialization
  544.       #--------------------------------------------------------------------------
  545.       def initialize(viewport)
  546.         # Saves Viewport
  547.         @viewport = viewport
  548.         # Creates Blank Instance Variables
  549.         @layers            = []    # Refers to Array of Sprites or Planes
  550.         @tileset          = nil  # Refers to Tileset Bitmap
  551.         @tileset_name      = ''    # Refers to Tileset Filename
  552.         @autotiles        = []    # Refers to Array of Autotile Bitmaps
  553.         @autotiles_name    = []    # Refers to Array of Autotile Filenames
  554.         @map_data          = nil  # Refers to 3D Array Of Tile Settings
  555.         @flash_data        = nil  # Refers to 3D Array of Tile Flashdata
  556.         @priorities        = nil  # Refers to Tileset Priorities
  557.         @visible          = true  # Refers to Tilest Visibleness
  558.         @ox                = 0    # Bitmap Offsets         
  559.         @oy                = 0    # Bitmap Offsets
  560.         @tilemap_settings  = nil  # Special Tilemap Settings
  561.         @dispose          = false # Disposed Flag
  562.         @refresh_autotiles = true  # Refresh Autotile Flag
  563.       end
  564.       #--------------------------------------------------------------------------
  565.       # * Setup
  566.       #--------------------------------------------------------------------------
  567.       def setup
  568.         # Print Error if Tilemap Settings not Found
  569.         if Tilemap_Options::Print_Error_Logs
  570.           if @tilemap_settings.nil?
  571.             p 'Tilemap Settings have not been set. System will not crash.'
  572.           end
  573.           if @map_data.nil?
  574.             p 'Map Data has not been set. System will crash.'
  575.           end
  576.         end
  577.         # Creates Layers
  578.         @layers = []
  579.         for l in 0...3
  580.           layer = @tilemap_settings.nil? || !@tilemap_settings.is_a_plane ?
  581.             Sprite.new(@viewport) : Plane.new(@viewport)
  582.           layer.bitmap = Bitmap.new(@map_data.xsize * 32, @map_data.ysize * 32)
  583.           layer.z = l * 150
  584.           layer.zoom_x = @tilemap_settings.nil? ? 1.0 : @tilemap_settings.zoom_x
  585.           layer.zoom_y = @tilemap_settings.nil? ? 1.0 : @tilemap_settings.zoom_y
  586.           unless @tilemap_settings.nil? || @tilemap_settings.tone.nil?
  587.             layer.tone = @tilemap_settings.tone
  588.           end
  589.           @layers << layer
  590.         end
  591.         # Update Flags
  592.         @refresh_data = nil
  593.         @zoom_x  = @tilemap_settings.nil? ? 1.0 : @tilemap_settings.zoom_x
  594.         @zoom_y  = @tilemap_settings.nil? ? 1.0 : @tilemap_settings.zoom_y
  595.         @tone    = @tilemap_settings.nil? ? nil : @tilemap_settings.tone
  596.         @hue      = @tilemap_settings.nil? ? 0  : @tilemap_settings.hue
  597.         @tilesize = @tilemap_settings.nil? ? 32  : @tilemap_settings.tile_size
  598.       end
  599.       #--------------------------------------------------------------------------
  600.       # * Dispose
  601.       #--------------------------------------------------------------------------
  602.       def dispose
  603.         # Dispose Layers (Sprites)
  604.         @layers.each { |layer| layer.dispose }
  605.         # Set Disposed Flag to True
  606.         @disposed = true
  607.       end
  608.       #--------------------------------------------------------------------------
  609.       # * Disposed?
  610.       #--------------------------------------------------------------------------
  611.       def disposed?
  612.         return @disposed
  613.       end
  614.       #--------------------------------------------------------------------------
  615.       # * Viewport
  616.       #--------------------------------------------------------------------------
  617.       def viewport
  618.         return @viewport
  619.       end
  620.       #--------------------------------------------------------------------------
  621.       # * Frame Update
  622.       #--------------------------------------------------------------------------
  623.       def update
  624.         # Set Refreshed Flag to On
  625.         needs_refresh = true
  626.         # If Map Data, Tilesize or HueChanges
  627.         if @map_data != @refresh_data || (@tilemap_settings != false &&
  628.           @hue != @tilemap_settings.hue) || (@tilemap_settings != false &&
  629.           @tilesize != @tilemap_settings.tile_size)
  630.           # Refresh Bitmaps
  631.           refresh
  632.           # Turns Refresh Flag to OFF
  633.           needs_refresh = false
  634.         end
  635.         # Zoom X, Zoom Y, and Tone Changes
  636.         unless @tilemap_settings.nil?
  637.           if @zoom_x != @tilemap_settings.zoom_x
  638.             @zoom_x = @tilemap_settings.zoom_x
  639.             @layers.each {|layer| layer.zoom_x = @zoom_x}
  640.           end
  641.           if @zoom_y != @tilemap_settings.zoom_y
  642.             @zoom_y = @tilemap_settings.zoom_y
  643.             @layers.each {|layer| layer.zoom_y = @zoom_y}
  644.           end
  645.           if @tone != @tilemap_settings.tone
  646.             @tone = @tilemap_settings.tone.nil? ?
  647.               Tone.new(0, 0, 0, 0) : @tilemap_settings.tone
  648.             @layers.each {|layer| layer.tone = @tone}
  649.           end
  650.         end
  651.         # Update layer Position offsets
  652.         for layer in @layers
  653.           layer.ox = @ox
  654.           layer.oy = @oy
  655.         end
  656.         # If Refresh Autotiles, Needs Refreshed & Autotile Reset Frame
  657.         if @refresh_autotiles && needs_refresh &&
  658.           Graphics.frame_count % Tilemap_Options::Animated_Autotiles_Frames == 0
  659.           # Refresh Autotiles
  660.           refresh_autotiles
  661.         end
  662.       end
  663.       #--------------------------------------------------------------------------
  664.       # * Refresh
  665.       #--------------------------------------------------------------------------
  666.       def refresh
  667.         # Saves Map Data & Tilesize
  668.         @refresh_data = @map_data
  669.         @hue      = @tilemap_settings.nil? ? 0  : @tilemap_settings.hue
  670.         @tilesize = @tilemap_settings.nil? ? 32 : @tilemap_settings.tile_size
  671.         # Passes Through Layers
  672.         for z in 0...@map_data.zsize
  673.           # Passes Through X Coordinates
  674.           for x in 0...@map_data.xsize
  675.             # Passes Through Z Coordinates
  676.             for y in 0...@map_data.ysize
  677.               # Collects Tile ID
  678.               id = @map_data[x, y, z]
  679.               # Skip if 0 tile
  680.               next if id == 0
  681.               # Passes Through All Priorities
  682.               for p in 0..5
  683.                 # Skip If Priority Doesn't Match
  684.                 next unless p == @priorities[id]
  685.                 # Cap Priority to Layer 3
  686.                 p = 2 if p > 2
  687.                 # Draw Tile
  688.                 id < 384 ? draw_autotile(x, y, p, id) : draw_tile(x, y, p, id)
  689.               end
  690.             end
  691.           end
  692.         end
  693.       end   
  694.       #--------------------------------------------------------------------------
  695.       # * Refresh Auto-Tiles
  696.       #--------------------------------------------------------------------------
  697.       def refresh_autotiles
  698.         # Auto-Tile Locations
  699.         autotile_locations = Table.new(@map_data.xsize, @map_data.ysize,
  700.           @map_data.zsize)
  701.         # Get X Tiles
  702.         x1 = [@ox / @tilesize - Tilemap_Options::Viewport_Padding, 0].max.round
  703.         x2 = [@viewport.rect.width / @tilesize +
  704.               Tilemap_Options::Viewport_Padding, @map_data.xsize].min.round
  705.         # Get Y Tiles
  706.         y1 = [@oy / @tilesize - Tilemap_Options::Viewport_Padding, 0].max.round
  707.         y2 = [@viewport.rect.height / @tilesize +
  708.               Tilemap_Options::Viewport_Padding, @map_data.ysize].min.round
  709.         # Passes Through Layers
  710.         for z in 0...@map_data.zsize
  711.           # Passes Through X Coordinates
  712.           for x in x1...x2
  713.             # Passes Through Y Coordinates
  714.             for y in y1...y2
  715.               # Collects Tile ID
  716.               id = @map_data[x, y, z]
  717.               # Skip if 0 tile
  718.               next if id == 0
  719.               # Skip If Non-Animated Tile
  720.               next unless @autotiles[id / 48 - 1].width / 96 > 1 if id < 384
  721.               # Passes Through All Priorities
  722.               for p in 0..5
  723.                 # Skip If Priority Doesn't Match
  724.                 next unless p == @priorities[id]
  725.                 # Cap Priority to Layer 3
  726.                 p = 2 if p > 2
  727.                 # If Autotile
  728.                 if id < 384
  729.                   # Draw Auto-Tile
  730.                   draw_autotile(x, y, p, id)
  731.                   # Draw Higher Tiles
  732.                   for l in 0...@map_data.zsize
  733.                     id_l = @map_data[x, y, l]
  734.                     draw_tile(x, y, p, id_l)
  735.                   end
  736.                   # Save Autotile Location
  737.                   autotile_locations[x, y, z] = 1
  738.                 # If Normal Tile
  739.                 else
  740.                   # If Autotile Drawn
  741.                   if autotile_locations[x, y, z] == 1
  742.                     # Redraw Normal Tile
  743.                     draw_tile(x, y, p, id)
  744.                     # Draw Higher Tiles
  745.                     for l in 0...@map_data.zsize
  746.                       id_l = @map_data[x, y, l]
  747.                       draw_tile(x, y, p, id_l)
  748.                     end
  749.                   end
  750.                 end
  751.               end
  752.             end
  753.           end
  754.         end
  755.       end     
  756.       #--------------------------------------------------------------------------
  757.       # * Draw Tile
  758.       #--------------------------------------------------------------------------
  759.       def draw_tile(x, y, z, id)
  760.         # Gets Tile Bitmap
  761.         bitmap = RPG::Cache.tile(@tileset_name, id, @hue)
  762.         # Calculates Tile Coordinates
  763.         x *= @tilesize
  764.         y *= @tilesize
  765.         # Draw Tile
  766.         if @tilesize == 32
  767.           @layers[z].bitmap.blt(x, y, bitmap, Rect.new(0, 0, 32, 32))
  768.         else
  769.           rect = Rect.new(x, y, @tilesize, @tilesize)
  770.           @layers[z].bitmap.stretch_blt(rect, bitmap, Rect.new(0, 0, 32, 32))
  771.         end
  772.       end
  773.       #--------------------------------------------------------------------------
  774.       # * Draw Auto-Tile
  775.       #--------------------------------------------------------------------------
  776.       def draw_autotile(x, y, z, tile_id)
  777.         # Gets Autotile Filename
  778.         filename = @autotiles_name[tile_id / 48 - 1]
  779.         # Reconfigure Tile ID
  780.         tile_id %= 48
  781.         # Gets Generated Autotile Bitmap Section
  782.         bitmap = RPG::Cache.autotile_tile(filename, tile_id, @hue)
  783.         # Calculates Tile Coordinates
  784.         x *= @tilesize
  785.         y *= @tilesize
  786.         # If Normal Tile
  787.         if @tilesize == 32
  788.           @layers[z].bitmap.blt(x, y, bitmap, Rect.new(0, 0, 32, 32))
  789.         # If Altered Dimensions
  790.         else
  791.           dest_rect = Rect.new(x, y, @tilesize, @tilesize)
  792.           @layers[z].bitmap.stretch_blt(dest_rect, bitmap, Rect.new(0, 0, 32, 32))
  793.         end
  794.       end
  795.       #--------------------------------------------------------------------------
  796.       # * Collect Bitmap
  797.       #--------------------------------------------------------------------------
  798.       def bitmap
  799.         # Creates New Blank Bitmap
  800.         bitmap = Bitmap.new(@layers[0].bitmap.width, @layers[0].bitmap.height)
  801.         # Passes Through All Layers
  802.         for layer in @layers
  803.           bitmap.blt(0, 0, layer.bitmap,
  804.             Rect.new(0, 0, bitmap.width, bitmap.height))
  805.         end
  806.         # Return Bitmap
  807.         return bitmap
  808.       end
  809.     end
复制代码

点评

谢谢,待我回家试试  发表于 2012-9-1 17:50
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-19 21:15

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表