Project1

标题: [RM脚本] 超华丽的缩放式伪3D脚本 [打印本页]

作者: saterick    时间: 2006-8-23 18:03
标题: [RM脚本] 超华丽的缩放式伪3D脚本
本帖最后由 传说VS天涯 于 2010-9-5 12:11 编辑
注意:
首先请确认自己的机器足够强悍!
偶的本本就不行,一点游戏就“脚本已备份”。
偶的台式机只能把祯数维持在10祯左右。
  1. #===============================================================================
  2. $width = 640    # Screen width        (will not change resolution,
  3. $height = 480   # Screen height        here for compatibility)
  4. $ov_zoom = 0.6  # Overworld zoom multiplier
  5. $strip_size = 8 # Size of each strip of the map.  Higher numbers will lag less.
  6.                 #  Recommended that this number be a power of 2.
  7.                 #  Do not make higher than 64.
  8. $curve = true   # Whether the map is curled, for overworlds (old method)
  9. $data_map = load_data("Data/MapInfos.rxdata")
  10. #===============================================================================
  11. class RPG::MapInfo
  12.   def name # Definition prevents location scripts from reading anything within
  13.     return @name.gsub(/\[.*\]/) {""} # brackets, including the brackets
  14.   end
  15.   #-----------------------------------------------------------------------------
  16.   def original_name
  17.     return @name
  18.   end
  19.   #-----------------------------------------------------------------------------
  20.   def overworld?
  21.     return @name.scan(/[OV]/).size > 0
  22.   end
  23.   #-----------------------------------------------------------------------------
  24.   def pitch
  25.     @name =~ /\[#[ ]*([00-99]+)\]/i
  26.     return $1
  27.   end
  28. end
  29. #===============================================================================
  30. class Draw_Tilemap # This class controls a set of sprites, with different Z
  31.                    #  values, arranged into horizontal bars
  32.   attr_accessor :tileset
  33.   attr_accessor :map_data
  34.   attr_accessor :priorities
  35.   attr_accessor :autotiles
  36.   attr_accessor :bitmaps
  37.   attr_accessor :pitch
  38.   attr_accessor :ox
  39.   attr_accessor :oy
  40.   attr_accessor :plus_y
  41.   INDEX = # Autotile definitions
  42.   [
  43.   26, 27, 32, 33, 4,  27, 32, 33, 26, 5,  32, 33, 4,  5,  32, 33,
  44.   26, 27, 32, 11, 4,  27, 32, 11, 26, 5,  32, 11, 4,  5,  32, 11,
  45.   26, 27, 10, 33, 4,  27, 10, 33, 26, 5,  10, 33, 4,  5,  10, 33,
  46.   26, 27, 10, 11, 4,  27, 10, 11, 26, 5,  10, 11, 4,  5,  10, 11,
  47.   24, 25, 30, 31, 24, 5,  30, 31, 24, 25, 30, 11, 24, 5,  30, 11,
  48.   14, 15, 20, 21, 14, 15, 20, 11, 14, 15, 10, 21, 14, 15, 10, 11,
  49.   28, 29, 34, 35, 28, 29, 10, 35, 4,  29, 34, 35, 4,  29, 10, 35,
  50.   38, 39, 44, 45, 4,  39, 44, 45, 38, 5,  44, 45, 4,  5,  44, 45,
  51.   24, 29, 30, 35, 14, 15, 44, 45, 12, 13, 18 ,19, 12, 13, 18, 11,
  52.   16, 17, 22, 23, 16, 17, 10, 23, 40, 41, 46, 47, 4,  41, 46, 47,
  53.   36, 37, 42, 43, 36, 5,  42, 43, 12, 17, 18, 23, 12, 13, 42, 43,
  54.   36, 41, 42, 47, 16, 17, 46, 47, 12, 17, 42, 47, 0,  1,  6,  7
  55.   ]
  56.   X = [0, 1, 0, 1] # Used in 16x16 autotile drawing; left, right, left, right
  57.   Y = [0, 0, 1, 1] # Used in 16x16 autotile drawing;   up,    up, down,  down
  58.   #-----------------------------------------------------------------------------
  59.   def initialize
  60.   # Get initial data from Game_Map
  61.     @tileset = RPG::Cache.tileset($game_map.tileset_name)
  62.     @map_data = $game_map.data
  63.     @priorities = $game_map.priorities
  64.     @autotiles = []
  65.     for i in 0..6
  66.       @autotiles[i] = RPG::Cache.autotile($game_map.autotile_names[i])
  67.     end
  68.   # Provide blank data in proper object form
  69.     @ox = 0
  70.     @oy = 0
  71.   # Bitmaps used for each priority's drawing.  Priorities 2-5 are combined.
  72.     @bitmaps = [Bitmap.new($game_map.width*32, $game_map.height*32+$strip_size),
  73.                 Bitmap.new($game_map.width*32, $game_map.height*32+$strip_size),
  74.                 Bitmap.new($game_map.width*32, $game_map.height*32+$strip_size)]
  75.   # Generate blank sprites
  76.     @sprites = [[], [], []]
  77.     for i in 0..2 # For each layer
  78.       for j in 0..$game_map.height * (32 / $strip_size) - 1
  79.       # For each horizontal strip of $strip_size height, make a blank sprite
  80.         @sprites[i].push(Sprite.new)
  81.         @sprites[i][j].bitmap = Bitmap.new($game_map.width*32, $strip_size*2)
  82.         @sprites[i][j].x = $width / 2
  83.         @sprites[i][j].y = -64
  84.         @sprites[i][j].z = -5 + (i * 10)
  85.       end
  86.     end
  87.     @disposed = false
  88.     draw
  89.   end
  90.   #-----------------------------------------------------------------------------
  91.   def update
  92.   # Retrieve variable values for slant drawing; these values accesible by event
  93.     @pitch = $game_map.pitch.to_f
  94.     @plus_y = $game_map.plus_y
  95.     for i in 0..2 # For each layer
  96.       for j in [0, (($height / 2) - (($height * 60) /
  97.                 @pitch) + @oy) / $strip_size].max.to_i..[@sprites[i].size - 1,
  98.                 (@oy + $height) / $strip_size].min.to_i
  99.       # For each strip within the visible screen, update OX/Y
  100.         @sprites[i][j].x = $width / 2
  101.         @sprites[i][j].y = j * $strip_size - @oy
  102.         unless @pitch == 0 # Apply X Zoom
  103.           @sprites[i][j].zoom_x = (@sprites[i][j].y - $height / 2) *
  104.                                   (@pitch / ($height * 25)) + 1
  105.           if $curve # Zoom Y values same as X, and compensate
  106.             @sprites[i][j].zoom_y = @sprites[i][j].zoom_x
  107.             @sprites[i][j].y += $strip_size * (1 - @sprites[i][j].zoom_y) *
  108.                                 ((1 - @sprites[i][j].zoom_y) /
  109.                                 (2 * ((@pitch / 100) /
  110.                                       ($height / ($strip_size * 2)))) + 0.5)
  111.           end
  112.         end
  113.         @sprites[i][j].ox = @ox + $width / 2
  114.       # Add plus_y value; used in airship script
  115.         @sprites[i][j].y += @plus_y
  116.       end
  117.     end
  118.   end
  119.   #-----------------------------------------------------------------------------
  120.   def dispose
  121.   # Dispose all sprites
  122.     for i in 0..2
  123.       for j in @sprites[i]
  124.         j.bitmap.dispose
  125.         j.dispose
  126.       end
  127.     end
  128.     for i in @bitmaps
  129.       i.dispose
  130.     end
  131.     @tileset.dispose
  132.     for i in 0..6
  133.       @autotiles[i].dispose
  134.     end
  135.     @disposed = true
  136.   end
  137.   #-----------------------------------------------------------------------------
  138.   def disposed?
  139.     return @disposed
  140.   end
  141.   #-----------------------------------------------------------------------------
  142.   def draw
  143.   # Draw each individual position by XY value
  144.     for x in 0...@map_data.xsize
  145.       for y in 0...@map_data.ysize
  146.         draw_position(x, y)
  147.       end
  148.     end
  149.     for i in 0..2 # For each priority
  150.       for j in 0..@sprites[i].size - 1
  151.       # For each horizontal strip, transfer the bitmap appropriately
  152.         @sprites[i][j].bitmap.blt(0, 0, @bitmaps[i],
  153.             Rect.new(0, j * $strip_size, $game_map.width * 32, $strip_size * 2))
  154.       end
  155.     end
  156.   end
  157.   #-----------------------------------------------------------------------------
  158.   def draw_position(x, y)
  159.     for layer in 0..2
  160.       pos = @map_data[x, y, layer]
  161.       @priorities[pos] = 2 if @priorities[pos] > 2 # Round priorities down to 2
  162.       if pos >= 384 # If it is a tile
  163.       # src_rect = 32x32 Rect on the tileset for source bitmap
  164.         src_rect = Rect.new(((pos-384)%8)*32, ((pos-384)/8)*32, 32, 32)
  165.       # Transfer source bitmap on the tileset to the current map tile
  166.         @bitmaps[@priorities[pos]].blt(x * 32, y * 32, @tileset, src_rect)
  167.       elsif pos >= 48 and pos < 384 # If it is an autotile
  168.         id = pos / 48 - 1 # Which autotile is used (0-6)
  169.       # plus_x is in development for animated autotiles
  170.         plus_x = 0 #((@anim / 4) % (@autotiles[id].width / 96)) * 96
  171.         for corner in 0..3
  172.           h = 4 * (pos % 48) + corner # Used to access INDEX
  173.         # src_rect = 16x16 Rect on the autotile for source bitmap
  174.           src_rect = Rect.new((INDEX[h]%6)*16+plus_x, (INDEX[h]/6)*16, 16, 16)
  175.         # Transfer source bitmap on the autotile to the current 16x16 tile
  176.           @bitmaps[@priorities[pos]].blt(x*32+X[corner]*16, y*32+Y[corner]*16,
  177.                                           @autotiles[id], src_rect)
  178.         end
  179.       end
  180.     end
  181.   end
  182. end
  183. #===============================================================================
  184. class Game_Map
  185.   attr_accessor :pitch
  186.   attr_accessor :plus_y
  187.   #-----------------------------------------------------------------------------
  188.   alias setup_or :setup
  189.   def setup(map_id)
  190.     setup_or(map_id)
  191.     @pitch = $data_map[$game_map.map_id].pitch
  192.     @plus_y = 0
  193.   end
  194.   #-----------------------------------------------------------------------------
  195.   def name
  196.     return $data_map[@map_id].name
  197.   end
  198. end
  199. #===============================================================================
  200. class Sprite_Character < RPG::Sprite
  201.   attr_accessor :character
  202.   #-----------------------------------------------------------------------------
  203.   def initialize(character = nil)
  204.     super()
  205.     @character = character
  206.     update
  207.   end
  208.   #-----------------------------------------------------------------------------
  209.   alias update_or :update
  210.   def update
  211.     update_or
  212.   # Update pitch value, and update zoom values to match
  213.     @pitch = $data_map[$game_map.map_id].pitch.to_f
  214.     self.zoom_x =
  215.     self.zoom_y = ((@character.screen_y - 16) - ($height / 2)) *
  216.                   (@pitch / ($height * 25)) + 1
  217.   # Set sprite coordinates.  X value is multiplied by zoom value from the center
  218.     self.x = ($width / 2) + ((@character.screen_x - ($width / 2)) * self.zoom_x)
  219.     self.y = @character.screen_y
  220.   # Add Y value for zoom compensation while in curve mode
  221.     if $curve and @pitch != 0
  222.       self.y += (8 * (1 - self.zoom_y) * ((1 - self.zoom_y) /
  223.                 (2 * ((@pitch / 100) / ($height / 16.0))) + 0.5))
  224.     end
  225.   # Add plus_y value; used in airship script
  226.     self.y += $game_map.plus_y unless @character.is_a?(Game_Player)
  227.     self.z = @character.screen_z(@ch) - (self.zoom_y < 0.5 ? 1000 : 0)
  228.     if $data_map[$game_map.map_id].overworld? and
  229.        @character.is_a?(Game_Player) # Multiply zoom by Overworld factor if
  230.       self.zoom_x *= $ov_zoom        #  the map is marked with [OV] and event
  231.       self.zoom_y *= $ov_zoom        #  is a Game_Player
  232.     end
  233.   end
  234. end
  235. #===============================================================================
  236. class Spriteset_Map
  237.   def initialize
  238.   # Make viewports
  239.     @viewport1 = Viewport.new(0, 0, 640, 480)
  240.     @viewport2 = Viewport.new(0, 0, 640, 480)
  241.     @viewport3 = Viewport.new(0, 0, 640, 480)
  242.     @viewport2.z = 2000
  243.     @viewport3.z = 5000
  244.   # Make tilemap
  245.     @tilemap = Draw_Tilemap.new
  246.   # Make panorama plane
  247.     @panorama = Plane.new
  248.     @panorama.z = -2000
  249.   # Make fog plane
  250.     @fog = Plane.new
  251.     @fog.z = 3000
  252.   # Make character sprites
  253.     @character_sprites = []
  254.     for i in $game_map.events.keys.sort
  255.       sprite = Sprite_Character.new($game_map.events[i])
  256.       @character_sprites.push(sprite)
  257.     end
  258.     @character_sprites.push(Sprite_Character.new($game_player))
  259.   # Make weather
  260.     @weather = RPG::Weather.new(@viewport1)
  261.   # Make picture sprites
  262.     @picture_sprites = []
  263.     for i in 1..50
  264.       @picture_sprites.push(Sprite_Picture.new(@viewport2,
  265.                                                $game_screen.pictures[i]))
  266.     end
  267.   # Make timer sprite
  268.     @timer_sprite = Sprite_Timer.new
  269.   # Frame update
  270.     update
  271.   end
  272.   #-----------------------------------------------------------------------------
  273.   def dispose
  274.   # Dispose of tilemap
  275.     @tilemap.dispose
  276.   # Dispose of panorama plane
  277.     @panorama.dispose
  278.   # Dispose of fog plane
  279.     @fog.dispose
  280.   # Dispose of character sprites
  281.     for sprite in @character_sprites
  282.       sprite.dispose
  283.     end
  284.   # Dispose of weather
  285.     @weather.dispose
  286.   # Dispose of picture sprites
  287.     for sprite in @picture_sprites
  288.       sprite.dispose
  289.     end
  290.   # Dispose of timer sprite
  291.     @timer_sprite.dispose
  292.   # Dispose of viewports
  293.     @viewport1.dispose
  294.     @viewport2.dispose
  295.     @viewport3.dispose
  296.   end
  297. end
复制代码
激活方法:
若要激活这个效果,请在工程中的地图名后加上[#**],**是缩放比率。例如地图名是:
“66后院”,那么将其改为“66后院[#12]”,就相当于对66后院这张地图实施12%的缩
放,这个数值请根据实际情况灵活调整。如果使用了显示地图名的脚本,地图后缀是不
会被显示出来的。不设置缩放比率,默认不进行地图缩放。如果设置有大地图,那么请
在大地图名后加上[OV],将会启用一套更合适的缩放效果。

杂感:
华丽确实是华丽,但是总体来说可用性不是很高,主要是那近乎疯狂的资源占用率……
另外还有个很大的缺陷——无视图块优先级……
如要使用,看来也只能是做R剧用用了(无视优先级对于一个游戏来说相当致命)。
而且不知道为什么,在这种伪3D地图上行走有点头晕……

转载自RPG Palace(原发布页面)
作者: saterick    时间: 2006-8-23 18:03
标题: [RM脚本] 超华丽的缩放式伪3D脚本
注意:
首先请确认自己的机器足够强悍!
偶的本本就不行,一点游戏就“脚本已备份”。
偶的台式机只能把祯数维持在10祯左右。

  1. #===============================================================================
  2. $width = 640    # Screen width        (will not change resolution,
  3. $height = 480   # Screen height        here for compatibility)
  4. $ov_zoom = 0.6  # Overworld zoom multiplier
  5. $strip_size = 8 # Size of each strip of the map.  Higher numbers will lag less.
  6.                 #  Recommended that this number be a power of 2.
  7.                 #  Do not make higher than 64.
  8. $curve = true   # Whether the map is curled, for overworlds (old method)
  9. $data_map = load_data("Data/MapInfos.rxdata")
  10. #===============================================================================
  11. class RPG::MapInfo
  12.   def name # Definition prevents location scripts from reading anything within
  13.     return @name.gsub(/\[.*\]/) {""} # brackets, including the brackets
  14.   end
  15.   #-----------------------------------------------------------------------------
  16.   def original_name
  17.     return @name
  18.   end
  19.   #-----------------------------------------------------------------------------
  20.   def overworld?
  21.     return @name.scan(/[OV]/).size > 0
  22.   end
  23.   #-----------------------------------------------------------------------------
  24.   def pitch
  25.     @name =~ /\[#[ ]*([00-99]+)\]/i
  26.     return $1
  27.   end
  28. end
  29. #===============================================================================
  30. class Draw_Tilemap # This class controls a set of sprites, with different Z
  31.                    #  values, arranged into horizontal bars
  32.   attr_accessor :tileset
  33.   attr_accessor :map_data
  34.   attr_accessor :priorities
  35.   attr_accessor :autotiles
  36.   attr_accessor :bitmaps
  37.   attr_accessor :pitch
  38.   attr_accessor :ox
  39.   attr_accessor :oy
  40.   attr_accessor :plus_y
  41.   INDEX = # Autotile definitions
  42.   [
  43.   26, 27, 32, 33, 4,  27, 32, 33, 26, 5,  32, 33, 4,  5,  32, 33,
  44.   26, 27, 32, 11, 4,  27, 32, 11, 26, 5,  32, 11, 4,  5,  32, 11,
  45.   26, 27, 10, 33, 4,  27, 10, 33, 26, 5,  10, 33, 4,  5,  10, 33,
  46.   26, 27, 10, 11, 4,  27, 10, 11, 26, 5,  10, 11, 4,  5,  10, 11,
  47.   24, 25, 30, 31, 24, 5,  30, 31, 24, 25, 30, 11, 24, 5,  30, 11,
  48.   14, 15, 20, 21, 14, 15, 20, 11, 14, 15, 10, 21, 14, 15, 10, 11,
  49.   28, 29, 34, 35, 28, 29, 10, 35, 4,  29, 34, 35, 4,  29, 10, 35,
  50.   38, 39, 44, 45, 4,  39, 44, 45, 38, 5,  44, 45, 4,  5,  44, 45,
  51.   24, 29, 30, 35, 14, 15, 44, 45, 12, 13, 18 ,19, 12, 13, 18, 11,
  52.   16, 17, 22, 23, 16, 17, 10, 23, 40, 41, 46, 47, 4,  41, 46, 47,
  53.   36, 37, 42, 43, 36, 5,  42, 43, 12, 17, 18, 23, 12, 13, 42, 43,
  54.   36, 41, 42, 47, 16, 17, 46, 47, 12, 17, 42, 47, 0,  1,  6,  7
  55.   ]
  56.   X = [0, 1, 0, 1] # Used in 16x16 autotile drawing; left, right, left, right
  57.   Y = [0, 0, 1, 1] # Used in 16x16 autotile drawing;   up,    up, down,  down
  58.   #-----------------------------------------------------------------------------
  59.   def initialize
  60.   # Get initial data from Game_Map
  61.     @tileset = RPG::Cache.tileset($game_map.tileset_name)
  62.     @map_data = $game_map.data
  63.     @priorities = $game_map.priorities
  64.     @autotiles = []
  65.     for i in 0..6
  66.       @autotiles[i] = RPG::Cache.autotile($game_map.autotile_names[i])
  67.     end
  68.   # Provide blank data in proper object form
  69.     @ox = 0
  70.     @oy = 0
  71.   # Bitmaps used for each priority's drawing.  Priorities 2-5 are combined.
  72.     @bitmaps = [Bitmap.new($game_map.width*32, $game_map.height*32+$strip_size),
  73.                 Bitmap.new($game_map.width*32, $game_map.height*32+$strip_size),
  74.                 Bitmap.new($game_map.width*32, $game_map.height*32+$strip_size)]
  75.   # Generate blank sprites
  76.     @sprites = [[], [], []]
  77.     for i in 0..2 # For each layer
  78.       for j in 0..$game_map.height * (32 / $strip_size) - 1
  79.       # For each horizontal strip of $strip_size height, make a blank sprite
  80.         @sprites[i].push(Sprite.new)
  81.         @sprites[i][j].bitmap = Bitmap.new($game_map.width*32, $strip_size*2)
  82.         @sprites[i][j].x = $width / 2
  83.         @sprites[i][j].y = -64
  84.         @sprites[i][j].z = -5 + (i * 10)
  85.       end
  86.     end
  87.     @disposed = false
  88.     draw
  89.   end
  90.   #-----------------------------------------------------------------------------
  91.   def update
  92.   # Retrieve variable values for slant drawing; these values accesible by event
  93.     @pitch = $game_map.pitch.to_f
  94.     @plus_y = $game_map.plus_y
  95.     for i in 0..2 # For each layer
  96.       for j in [0, (($height / 2) - (($height * 60) /
  97.                 @pitch) + @oy) / $strip_size].max.to_i..[@sprites[i].size - 1,
  98.                 (@oy + $height) / $strip_size].min.to_i
  99.       # For each strip within the visible screen, update OX/Y
  100.         @sprites[i][j].x = $width / 2
  101.         @sprites[i][j].y = j * $strip_size - @oy
  102.         unless @pitch == 0 # Apply X Zoom
  103.           @sprites[i][j].zoom_x = (@sprites[i][j].y - $height / 2) *
  104.                                   (@pitch / ($height * 25)) + 1
  105.           if $curve # Zoom Y values same as X, and compensate
  106.             @sprites[i][j].zoom_y = @sprites[i][j].zoom_x
  107.             @sprites[i][j].y += $strip_size * (1 - @sprites[i][j].zoom_y) *
  108.                                 ((1 - @sprites[i][j].zoom_y) /
  109.                                 (2 * ((@pitch / 100) /
  110.                                       ($height / ($strip_size * 2)))) + 0.5)
  111.           end
  112.         end
  113.         @sprites[i][j].ox = @ox + $width / 2
  114.       # Add plus_y value; used in airship script
  115.         @sprites[i][j].y += @plus_y
  116.       end
  117.     end
  118.   end
  119.   #-----------------------------------------------------------------------------
  120.   def dispose
  121.   # Dispose all sprites
  122.     for i in 0..2
  123.       for j in @sprites[i]
  124.         j.bitmap.dispose
  125.         j.dispose
  126.       end
  127.     end
  128.     for i in @bitmaps
  129.       i.dispose
  130.     end
  131.     @tileset.dispose
  132.     for i in 0..6
  133.       @autotiles[i].dispose
  134.     end
  135.     @disposed = true
  136.   end
  137.   #-----------------------------------------------------------------------------
  138.   def disposed?
  139.     return @disposed
  140.   end
  141.   #-----------------------------------------------------------------------------
  142.   def draw
  143.   # Draw each individual position by XY value
  144.     for x in 0...@map_data.xsize
  145.       for y in 0...@map_data.ysize
  146.         draw_position(x, y)
  147.       end
  148.     end
  149.     for i in 0..2 # For each priority
  150.       for j in 0..@sprites[i].size - 1
  151.       # For each horizontal strip, transfer the bitmap appropriately
  152.         @sprites[i][j].bitmap.blt(0, 0, @bitmaps[i],
  153.             Rect.new(0, j * $strip_size, $game_map.width * 32, $strip_size * 2))
  154.       end
  155.     end
  156.   end
  157.   #-----------------------------------------------------------------------------
  158.   def draw_position(x, y)
  159.     for layer in 0..2
  160.       pos = @map_data[x, y, layer]
  161.       @priorities[pos] = 2 if @priorities[pos] > 2 # Round priorities down to 2
  162.       if pos >= 384 # If it is a tile
  163.       # src_rect = 32x32 Rect on the tileset for source bitmap
  164.         src_rect = Rect.new(((pos-384)%8)*32, ((pos-384)/8)*32, 32, 32)
  165.       # Transfer source bitmap on the tileset to the current map tile
  166.         @bitmaps[@priorities[pos]].blt(x * 32, y * 32, @tileset, src_rect)
  167.       elsif pos >= 48 and pos < 384 # If it is an autotile
  168.         id = pos / 48 - 1 # Which autotile is used (0-6)
  169.       # plus_x is in development for animated autotiles
  170.         plus_x = 0 #((@anim / 4) % (@autotiles[id].width / 96)) * 96
  171.         for corner in 0..3
  172.           h = 4 * (pos % 48) + corner # Used to access INDEX
  173.         # src_rect = 16x16 Rect on the autotile for source bitmap
  174.           src_rect = Rect.new((INDEX[h]%6)*16+plus_x, (INDEX[h]/6)*16, 16, 16)
  175.         # Transfer source bitmap on the autotile to the current 16x16 tile
  176.           @bitmaps[@priorities[pos]].blt(x*32+X[corner]*16, y*32+Y[corner]*16,
  177.                                           @autotiles[id], src_rect)
  178.         end
  179.       end
  180.     end
  181.   end
  182. end
  183. #===============================================================================
  184. class Game_Map
  185.   attr_accessor :pitch
  186.   attr_accessor :plus_y
  187.   #-----------------------------------------------------------------------------
  188.   alias setup_or :setup
  189.   def setup(map_id)
  190.     setup_or(map_id)
  191.     @pitch = $data_map[$game_map.map_id].pitch
  192.     @plus_y = 0
  193.   end
  194.   #-----------------------------------------------------------------------------
  195.   def name
  196.     return $data_map[@map_id].name
  197.   end
  198. end
  199. #===============================================================================
  200. class Sprite_Character < RPG::Sprite
  201.   attr_accessor :character
  202.   #-----------------------------------------------------------------------------
  203.   def initialize(character = nil)
  204.     super()
  205.     @character = character
  206.     update
  207.   end
  208.   #-----------------------------------------------------------------------------
  209.   alias update_or :update
  210.   def update
  211.     update_or
  212.   # Update pitch value, and update zoom values to match
  213.     @pitch = $data_map[$game_map.map_id].pitch.to_f
  214.     self.zoom_x =
  215.     self.zoom_y = ((@character.screen_y - 16) - ($height / 2)) *
  216.                   (@pitch / ($height * 25)) + 1
  217.   # Set sprite coordinates.  X value is multiplied by zoom value from the center
  218.     self.x = ($width / 2) + ((@character.screen_x - ($width / 2)) * self.zoom_x)
  219.     self.y = @character.screen_y
  220.   # Add Y value for zoom compensation while in curve mode
  221.     if $curve and @pitch != 0
  222.       self.y += (8 * (1 - self.zoom_y) * ((1 - self.zoom_y) /
  223.                 (2 * ((@pitch / 100) / ($height / 16.0))) + 0.5))
  224.     end
  225.   # Add plus_y value; used in airship script
  226.     self.y += $game_map.plus_y unless @character.is_a?(Game_Player)
  227.     self.z = @character.screen_z(@ch) - (self.zoom_y < 0.5 ? 1000 : 0)
  228.     if $data_map[$game_map.map_id].overworld? and
  229.        @character.is_a?(Game_Player) # Multiply zoom by Overworld factor if
  230.       self.zoom_x *= $ov_zoom        #  the map is marked with [OV] and event
  231.       self.zoom_y *= $ov_zoom        #  is a Game_Player
  232.     end
  233.   end
  234. end
  235. #===============================================================================
  236. class Spriteset_Map
  237.   def initialize
  238.   # Make viewports
  239.     @viewport1 = Viewport.new(0, 0, 640, 480)
  240.     @viewport2 = Viewport.new(0, 0, 640, 480)
  241.     @viewport3 = Viewport.new(0, 0, 640, 480)
  242.     @viewport2.z = 2000
  243.     @viewport3.z = 5000
  244.   # Make tilemap
  245.     @tilemap = Draw_Tilemap.new
  246.   # Make panorama plane
  247.     @panorama = Plane.new
  248.     @panorama.z = -2000
  249.   # Make fog plane
  250.     @fog = Plane.new
  251.     @fog.z = 3000
  252.   # Make character sprites
  253.     @character_sprites = []
  254.     for i in $game_map.events.keys.sort
  255.       sprite = Sprite_Character.new($game_map.events[i])
  256.       @character_sprites.push(sprite)
  257.     end
  258.     @character_sprites.push(Sprite_Character.new($game_player))
  259.   # Make weather
  260.     @weather = RPG::Weather.new(@viewport1)
  261.   # Make picture sprites
  262.     @picture_sprites = []
  263.     for i in 1..50
  264.       @picture_sprites.push(Sprite_Picture.new(@viewport2,
  265.                                                $game_screen.pictures[i]))
  266.     end
  267.   # Make timer sprite
  268.     @timer_sprite = Sprite_Timer.new
  269.   # Frame update
  270.     update
  271.   end
  272.   #-----------------------------------------------------------------------------
  273.   def dispose
  274.   # Dispose of tilemap
  275.     @tilemap.dispose
  276.   # Dispose of panorama plane
  277.     @panorama.dispose
  278.   # Dispose of fog plane
  279.     @fog.dispose
  280.   # Dispose of character sprites
  281.     for sprite in @character_sprites
  282.       sprite.dispose
  283.     end
  284.   # Dispose of weather
  285.     @weather.dispose
  286.   # Dispose of picture sprites
  287.     for sprite in @picture_sprites
  288.       sprite.dispose
  289.     end
  290.   # Dispose of timer sprite
  291.     @timer_sprite.dispose
  292.   # Dispose of viewports
  293.     @viewport1.dispose
  294.     @viewport2.dispose
  295.     @viewport3.dispose
  296.   end
  297. end
复制代码

激活方法:
若要激活这个效果,请在工程中的地图名后加上[#**],**是缩放比率。例如地图名是:
“66后院”,那么将其改为“66后院[#12]”,就相当于对66后院这张地图实施12%的缩
放,这个数值请根据实际情况灵活调整。如果使用了显示地图名的脚本,地图后缀是不
会被显示出来的。不设置缩放比率,默认不进行地图缩放。如果设置有大地图,那么请
在大地图名后加上[OV],将会启用一套更合适的缩放效果。

杂感:
华丽确实是华丽,但是总体来说可用性不是很高,主要是那近乎疯狂的资源占用率……
另外还有个很大的缺陷——无视图块优先级……
如要使用,看来也只能是做R剧用用了(无视优先级对于一个游戏来说相当致命)。
而且不知道为什么,在这种伪3D地图上行走有点头晕……

转载自RPG Palace(原发布页面)
作者: 美兽    时间: 2006-8-23 18:24
想起来了SFC的很多经典游戏的大地图
作者: 千鸟    时间: 2006-8-23 18:29
不错呀!!!!!!!!!!!!!!

好东西
作者: sdxsdx    时间: 2006-8-23 18:55
好啊!{/qiang}
作者: 两只鱼    时间: 2006-8-23 20:05
这个强悍的无话可说了~~
作者: frantice    时间: 2006-8-24 23:32
看看这个,同样是伪3D地图,怎么区别这么大?
http://rpgcreative.forumpro.fr/f ... e-quelques-bugs.htm
作者: king    时间: 2006-8-24 23:44
{/qiang}
什么效果都能出来,只要有能力
作者: BB崽    时间: 2006-8-24 23:57
太耗内存了
作者: NICK    时间: 2006-8-25 00:00
提示: 作者被禁止或删除 内容自动屏蔽
作者: 小湖    时间: 2006-8-25 00:18
太卡了{/gg}
作者: tsjmq    时间: 2006-8-25 02:29
{/ll}效果好华丽~~~~不过我机子走不动,华丽的效果变成华丽的卡了
作者: 竹眉叶心    时间: 2006-8-25 03:03
提示: 作者被禁止或删除 内容自动屏蔽
作者: saterick    时间: 2006-8-25 03:05
以下引用竹眉叶心于2006-8-24 19:03:10的发言:

这个是德语还是西班牙语啊。。。。

脚本如果无视图块优先级的话。。那基本上没什么用了。。

法语的……
感觉起来是大同小异。
作者: 竹眉叶心    时间: 2006-8-25 03:08
提示: 作者被禁止或删除 内容自动屏蔽
作者: 亿万星辰    时间: 2006-8-25 04:17
这个东西只可以做华丽效果演示,不进行深度优化的话基本没什么实用价值......
作者: 小湖    时间: 2006-8-25 05:25
脚本已经备份{/fd}
作者: ccen3020    时间: 2006-8-26 18:58
这个应该是占用CPU过大吧.......

谁有扣肉或者FX60+来测试下{/pz}
作者: beiduo    时间: 2006-8-28 23:15
我没有用楼主的范例而只是用了0.7版的脚本,似乎并不卡。
作者: 嫁衣    时间: 2006-8-29 00:55
orz
卡得厉害啊,走路有点像爬{/hx}
作者: 西撒1314    时间: 2006-8-29 04:15
提示: 作者被禁止或删除 内容自动屏蔽
作者: 叼烟的男孩    时间: 2006-8-29 04:41
硬盘狂转 卡
作者: 叼烟的男孩    时间: 2006-8-29 04:42
地图大就卡死
作者: peter神人    时间: 2006-8-29 07:27
卡!
作者: 暴风の龙    时间: 2006-8-29 10:33
无视优先级....那就没用了...
作者: 暴风の龙    时间: 2006-8-29 10:35
好帅的效果,不过走得好慢...
作者: 暴风の龙    时间: 2006-8-29 10:45
我放到自己的游戏测试过后,请大家看看下面两张图.....
关于山道和森林的效果倒是不错

但是到了城市后.......那钟塔竟然出现弯曲...房子倾倒.....

作者: 宰牛四天王    时间: 2006-8-30 06:26
提示: 作者被禁止或删除 内容自动屏蔽
作者: tyghbnrfv3    时间: 2006-8-30 07:08
提示: 作者被禁止或删除 内容自动屏蔽
作者: 暴风の龙    时间: 2006-8-30 08:53
以下引用tyghbnrfv3于2006-8-29 23:08:14的发言:


以下引用暴风の龙于2006-8-29 2:45:18的发言:

但是到了城市后.......那钟塔竟然出现弯曲...房子倾倒.....



台风经过的效果....


别说了,在城市里走真的有点晕的感觉........房子啊什么随着你的走动慢慢变弯...好恐怖...

作者: saterick    时间: 2006-8-30 16:21
优先级和运算速度……这两个问题不解决……这个脚本……嗯……一点用处也没有……
作者: 秋弦月    时间: 2006-8-31 00:43
视觉效果不错哈,也只能做做视觉效果游戏了{/gg}
作者: 风雪优游    时间: 2006-9-14 05:42
想起了....太阳....
作者: 张永    时间: 2006-9-14 12:37
这种类型就是幻想传说的大地图类型。所以说除了做大地图以外,几乎没有用处
作者: RockK    时间: 2006-9-15 21:31
以下引用张永于2006-9-14 4:37:31的发言:

这种类型就是幻想传说的大地图类型。所以说除了做大地图以外,几乎没有用处


[本贴由作者于 2006-9-14 4:39:49 最后编辑]

但是就做大地图就足够拉~~

黄金的太阳   SFC-FF4   DQ……  无敌的好东西!

我顶!!!!!!!!!!{/dy}
作者: 江忆痕    时间: 2007-1-9 04:46
华丽啊........我设的800..........速度啊..........
作者: devilcraft    时间: 2007-1-15 08:18
提示: 作者被禁止或删除 内容自动屏蔽
作者: FinalFantasy    时间: 2007-1-15 09:44
点了出处那个网站..直接想起FF4....
作者: 再塑军魂    时间: 2007-1-17 14:47
提示: 作者被禁止或删除 内容自动屏蔽
作者: ⑩字绯影    时间: 2007-2-1 06:28
R版极品飞车要诞生了....
作者: 鸾翎    时间: 2007-2-11 03:15
提示: 作者被禁止或删除 内容自动屏蔽
作者: Forever    时间: 2007-2-11 03:22
提示: 作者被禁止或删除 内容自动屏蔽
作者: 982794939    时间: 2010-9-4 17:20
好就好,就是树在地下
作者: 灵九哲    时间: 2010-9-4 20:21
呵呵,以前看过!
作者: lcg0593    时间: 2010-9-5 08:05
LS是指那艘船么。。。。。
作者: zzy691108    时间: 2010-9-5 08:15
这不是跟我的一样吗




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1