rmxp吧 关注:1,908贴子:8,174
  • 11回复贴,共1

【脚本】伪3D脚本

取消只看楼主收藏回复

也许你对一般的RMXP 中2D显示的模式已经有点厌倦
这时候你可以用一下以下伪3D的脚本来改变一下RMXP的显示
此脚本的视觉弧度有不同的改变
用法如下:

在地图的名称后面加入[#14] 就能得到跟下图一样的效果...
弧度能除你输入的数字不同而改变

另外此脚本还有一个功能,就是把主角人物变小..
有的时候RPG经常有大地图...但是如果大地图的人物角色跟在村庄内的角色大小一样..会有点奇怪...
如果在大地图的名称加上[OV],就能达到主角人物变小的效果

当然你也可以同时在地图名称后面加上[OV][#14]加上大地图的弧度。

更具体的应用可以自行把下面脚本插入至你的rmxp游戏中进行测试



1楼2008-04-25 18:03回复
    =begin

    Mode07 on the Map!
    Includes:
     Mode07 v0.6
     Overworld Sprite Resize
     Written by mewsterus

    Special Thanks:
     Fanha Giang (for a reverse engineered Tilemap class)
    --------------------------------------------------------------------------------
    Instructions:
    --------------------------------------------------------------------------------
    To install, just insert this in a descriptive code slot right above Main.
     This is different than previous instructions; please read the next paragraph.

    If you had a previous install of this script and need an original version of
     Spriteset_Map, one can be found at:
     http://www.rpg-palace.com/scripts/spriteset_map.txt

    To activate Mode07, add [#XX] to the map's name, replacing XX with the
     percentage of Mode07 to apply. Greater numbers will result in a more slanted
     world.
     
    To activate overworld sprite resize, add [OV] to the map's name. This will make
     sprites smaller on that map.

    For the purposes of location scripts, these identifiers will not appear.


    Examples:

    "Overworld[#40]" will result in a slant identical to the second screenshot.
    "Underworld[OV]" will resize only the player character to a small size, as if
     seen from high above.
    "Atthelevelworld[OV][#12]" will result in the player being resized, and a modest
     slant of 12%
    "JustPlainWorld" will result in the same old map you've always seen.

    To add a sky, simply use the panorama with the tileset. Also, events will not
     be drawn flat with the map. Any vertical objects such as trees should be put
     in events and displayed that way.

    You can also add a sky by adding a fog. If you add this, you can make it look
     like the first screenshot.

    A note on the $strip_size variable; the default value is 8, however there is
     extremely minimal, almost nonexistant lag with 16. The screen is extremely
     smooth with 4, or even 2. If you're having major problems with lag, you may
     need to use 32, but it won't look too pretty.
    --------------------------------------------------------------------------------
    * Draw_Tilemap v1.72-0.6
    Fanha Giang, 02/12/2006 (mm/dd/yyyy)
    Edited for Mode07 by mewsterus 08/08/2006 (mm/dd/yyyy)
    =end


    2楼2008-04-25 18:06
    回复
      #因为百度不能贴一次性太长的脚本
      #请把分开了的脚本全部插入同一页在main之前

      #===============================================================================
      $width = 640 # Screen width (will not change resolution,
      $height = 480 # Screen height here for compatibility)
      $ov_zoom = 0.6 # Overworld zoom multiplier
      $strip_size = 8 # Size of each strip of the map. Higher numbers will lag less.
       # Recommended that this number be a power of 2.
       # Do not make higher than 64.
      $curve = true # Whether the map is curled, for overworlds (old method)
      $data_map = load_data("Data/MapInfos.rxdata")
      #===============================================================================
      class RPG::MapInfo
       def name # Definition prevents location scripts from reading anything within
       return @name.gsub(/\[.*\]/) {""} # brackets, including the brackets
       end
       #-----------------------------------------------------------------------------
       def original_name
       return @name
       end
       #-----------------------------------------------------------------------------
       def overworld?
       return @name.scan(/[OV]/).size > 0
       end
       #-----------------------------------------------------------------------------
       def pitch
       @name =~ /\[#[ ]*([00-99]+)\]/i
       return $1
       end
      end
      #===============================================================================
      class Draw_Tilemap # This class controls a set of sprites, with different Z
       # values, arranged into horizontal bars
       attr_accessor :tileset
       attr_accessor :map_data
       attr_accessor :priorities
       attr_accessor :autotiles
       attr_accessor :bitmaps
       attr_accessor :pitch
       attr_accessor :ox
       attr_accessor :oy
       attr_accessor :plus_y
       INDEX = # Autotile definitions
       [
       26, 27, 32, 33, 4, 27, 32, 33, 26, 5, 32, 33, 4, 5, 32, 33,
       26, 27, 32, 11, 4, 27, 32, 11, 26, 5, 32, 11, 4, 5, 32, 11,
       26, 27, 10, 33, 4, 27, 10, 33, 26, 5, 10, 33, 4, 5, 10, 33,
       26, 27, 10, 11, 4, 27, 10, 11, 26, 5, 10, 11, 4, 5, 10, 11,
       24, 25, 30, 31, 24, 5, 30, 31, 24, 25, 30, 11, 24, 5, 30, 11,
       14, 15, 20, 21, 14, 15, 20, 11, 14, 15, 10, 21, 14, 15, 10, 11,
       28, 29, 34, 35, 28, 29, 10, 35, 4, 29, 34, 35, 4, 29, 10, 35,
       38, 39, 44, 45, 4, 39, 44, 45, 38, 5, 44, 45, 4, 5, 44, 45,
       24, 29, 30, 35, 14, 15, 44, 45, 12, 13, 18 ,19, 12, 13, 18, 11,
       16, 17, 22, 23, 16, 17, 10, 23, 40, 41, 46, 47, 4, 41, 46, 47,
       36, 37, 42, 43, 36, 5, 42, 43, 12, 17, 18, 23, 12, 13, 42, 43,
       36, 41, 42, 47, 16, 17, 46, 47, 12, 17, 42, 47, 0, 1, 6, 7
       ]
       X = [0, 1, 0, 1] # Used in 16x16 autotile drawing; left, right, left, right
       Y = [0, 0, 1, 1] # Used in 16x16 autotile drawing; up, up, down, down
       #-----------------------------------------------------------------------------
       def initialize
       # Get initial data from Game_Map
       @tileset = RPG::Cache.tileset($game_map.tileset_name)
       @map_data = $game_map.data
       @priorities = $game_map.priorities
       @autotiles = []
       for i in 0..6
       @autotiles[i] = RPG::Cache.autotile($game_map.autotile_names[i])
       end
       # Provide blank data in proper object form
       @ox = 0
       @oy = 0
       # Bitmaps used for each priority's drawing. Priorities 2-5 are combined.
       @bitmaps = [Bitmap.new($game_map.width*32, $game_map.height*32+$strip_size),
       Bitmap.new($game_map.width*32, $game_map.height*32+$strip_size),
       Bitmap.new($game_map.width*32, $game_map.height*32+$strip_size)]
       # Generate blank sprites
       @sprites = [[], [], []]
       for i in 0..2 # For each layer
       for j in 0..$game_map.height * (32 / $strip_size) - 1
       # For each horizontal strip of $strip_size height, make a blank sprite
       @sprites[i].push(Sprite.new)
       @sprites[i][j].bitmap = Bitmap.new($game_map.width*32, $strip_size*2)
       @sprites[i][j].x = $width / 2
       @sprites[i][j].y = -64
       @sprites[i][j].z = -5 + (i * 10)
       end
       end
       @disposed = false
       draw
       end
       #-----------------------------------------------------------------------------
       def update
       # Retrieve variable values for slant drawing; these values accesible by event
       @pitch = $game_map.pitch.to_f
       @plus_y = $game_map.plus_y
       for i in 0..2 # For each layer
       for j in [0, (($height / 2) - (($height * 60) /
       @pitch) + @oy) / $strip_size].max.to_i..[@sprites[i].size - 1,
       (@oy + $height) / $strip_size].min.to_i
       # For each strip within the visible screen, update OX/Y
       @sprites[i][j].x = $width / 2
       @sprites[i][j].y = j * $strip_size - @oy
       unless @pitch == 0 # Apply X Zoom
       @sprites[i][j].zoom_x = (@sprites[i][j].y - $height / 2) *
       (@pitch / ($height * 25)) + 1
       if $curve # Zoom Y values same as X, and compensate
       @sprites[i][j].zoom_y = @sprites[i][j].zoom_x
       @sprites[i][j].y += $strip_size * (1 - @sprites[i][j].zoom_y) *
       ((1 - @sprites[i][j].zoom_y) /
       (2 * ((@pitch / 100) /
       ($height / ($strip_size * 2)))) + 0.5)
       end
       end
       @sprites[i][j].ox = @ox + $width / 2
       # Add plus_y value; used in airship script
       @sprites[i][j].y += @plus_y
       end
       end
       end


      3楼2008-04-25 18:09
      回复
        #-----------------------------------------------------------------------------
         def dispose
         # Dispose all sprites
         for i in 0..2
         for j in @sprites[i]
         j.bitmap.dispose
         j.dispose
         end
         end
         for i in @bitmaps
         i.dispose
         end
         @tileset.dispose
         for i in 0..6
         @autotiles[i].dispose
         end
         @disposed = true
         end
         #-----------------------------------------------------------------------------
         def disposed?
         return @disposed
         end
         #-----------------------------------------------------------------------------
         def draw
         # Draw each individual position by XY value
         for x in 0...@map_data.xsize
         for y in 0...@map_data.ysize
         draw_position(x, y)
         end
         end
         for i in 0..2 # For each priority
         for j in 0..@sprites[i].size - 1
         # For each horizontal strip, transfer the bitmap appropriately
         @sprites[i][j].bitmap.blt(0, 0, @bitmaps[i],
         Rect.new(0, j * $strip_size, $game_map.width * 32, $strip_size * 2))
         end
         end
         end
         #-----------------------------------------------------------------------------
         def draw_position(x, y)
         for layer in 0..2
         pos = @map_data[x, y, layer]
         @priorities[pos] = 2 if @priorities[pos] > 2 # Round priorities down to 2
         if pos >= 384 # If it is a tile
         # src_rect = 32x32 Rect on the tileset for source bitmap
         src_rect = Rect.new(((pos-384)%8)*32, ((pos-384)/8)*32, 32, 32)
         # Transfer source bitmap on the tileset to the current map tile
         @bitmaps[@priorities[pos]].blt(x * 32, y * 32, @tileset, src_rect)
         elsif pos >= 48 and pos < 384 # If it is an autotile
         id = pos / 48 - 1 # Which autotile is used (0-6)
         # plus_x is in development for animated autotiles
         plus_x = 0 #((@anim / 4) % (@autotiles[id].width / 96)) * 96
         for corner in 0..3
         h = 4 * (pos % 48) + corner # Used to access INDEX
         # src_rect = 16x16 Rect on the autotile for source bitmap
         src_rect = Rect.new((INDEX[h]%6)*16+plus_x, (INDEX[h]/6)*16, 16, 16)
         # Transfer source bitmap on the autotile to the current 16x16 tile
         @bitmaps[@priorities[pos]].blt(x*32+X[corner]*16, y*32+Y[corner]*16,
         @autotiles[id], src_rect)
         end
         end
         end
         end
        end
        #===============================================================================
        class Game_Map
         attr_accessor :pitch
         attr_accessor :plus_y
         #-----------------------------------------------------------------------------
         alias setup_or :setup
         def setup(map_id)
         setup_or(map_id)
         @pitch = $data_map[$game_map.map_id].pitch
         @plus_y = 0
         end
         #-----------------------------------------------------------------------------
         def name
         return $data_map[@map_id].name
         end
        end
        #===============================================================================
        class Sprite_Character < RPG::Sprite
         attr_accessor :character
         #-----------------------------------------------------------------------------
         def initialize(character = nil)
         super()
         @character = character
         update
         end
         #-----------------------------------------------------------------------------
         alias update_or :update
         def update
         update_or
         # Update pitch value, and update zoom values to match
        


        4楼2008-04-25 18:10
        回复
           @pitch = $data_map[$game_map.map_id].pitch.to_f
           self.zoom_x =
           self.zoom_y = ((@character.screen_y - 16) - ($height / 2)) *
           (@pitch / ($height * 25)) + 1
           # Set sprite coordinates. X value is multiplied by zoom value from the center
           self.x = ($width / 2) + ((@character.screen_x - ($width / 2)) * self.zoom_x)
           self.y = @character.screen_y
           # Add Y value for zoom compensation while in curve mode
           if $curve and @pitch != 0
           self.y += (8 * (1 - self.zoom_y) * ((1 - self.zoom_y) /
           (2 * ((@pitch / 100) / ($height / 16.0))) + 0.5))
           end
           # Add plus_y value; used in airship script
           self.y += $game_map.plus_y unless @character.is_a?(Game_Player)
           self.z = @character.screen_z(@ch) - (self.zoom_y < 0.5 ? 1000 : 0)
           if $data_map[$game_map.map_id].overworld? and
           @character.is_a?(Game_Player) # Multiply zoom by Overworld factor if
           self.zoom_x *= $ov_zoom # the map is marked with [OV] and event
           self.zoom_y *= $ov_zoom # is a Game_Player
           end
           end
          end
          #===============================================================================
          class Spriteset_Map
           def initialize
           # Make viewports
           @viewport1 = Viewport.new(0, 0, 640, 480)
           @viewport2 = Viewport.new(0, 0, 640, 480)
           @viewport3 = Viewport.new(0, 0, 640, 480)
           @viewport2.z = 2000
           @viewport3.z = 5000
           # Make tilemap
           @tilemap = Draw_Tilemap.new
           # Make panorama plane
           @panorama = Plane.new
           @panorama.z = -2000
           # Make fog plane
           @fog = Plane.new
           @fog.z = 3000
           # Make character sprites
           @character_sprites = []
           for i in $game_map.events.keys.sort
           sprite = Sprite_Character.new($game_map.events[i])
           @character_sprites.push(sprite)
           end
           @character_sprites.push(Sprite_Character.new($game_player))
           # Make weather
           @weather = RPG::Weather.new(@viewport1)
           # Make picture sprites
           @picture_sprites = []
           for i in 1..50
           @picture_sprites.push(Sprite_Picture.new(@viewport2,
           $game_screen.pictures[i]))
           end
           # Make timer sprite
           @timer_sprite = Sprite_Timer.new
           # Frame update
           update
           end
           #-----------------------------------------------------------------------------
           def dispose
           # Dispose of tilemap
           @tilemap.dispose
           # Dispose of panorama plane
           @panorama.dispose
           # Dispose of fog plane
           @fog.dispose
           # Dispose of character sprites
           for sprite in @character_sprites
           sprite.dispose
           end
           # Dispose of weather
           @weather.dispose
           # Dispose of picture sprites
           for sprite in @picture_sprites
           sprite.dispose
           end
           # Dispose of timer sprite
           @timer_sprite.dispose
           # Dispose of viewports
           @viewport1.dispose
           @viewport2.dispose
           @viewport3.dispose
           end
          end


          5楼2008-04-25 18:10
          回复
            #===============================================================================
            $width = 640 # Screen width (will not change resolution,
            $height = 480 # Screen height here for compatibility)
            $ov_zoom = 0.6 # Overworld zoom multiplier
            $strip_size = 8 # Size of each strip of the map. Higher numbers will lag less.
             # Recommended that this number be a power of 2.
             # Do not make higher than 64.
            $curve = true # Whether the map is curled, for overworlds (old method)
            $data_map = load_data("Data/MapInfos.rxdata")
            #===============================================================================
            class RPG::MapInfo
             def name # Definition prevents location scripts from reading anything within
             return @name.gsub(/\[.*\]/) {""} # brackets, including the brackets
             end
             #-----------------------------------------------------------------------------
             def original_name
             return @name
             end
             #-----------------------------------------------------------------------------
             def overworld?
             return @name.scan(/[OV]/).size > 0
             end
             #-----------------------------------------------------------------------------
             def pitch
             @name =~ /\[#[ ]*([00-99]+)\]/i
             return $1
             end
            end
            #===============================================================================
            class Draw_Tilemap # This class controls a set of sprites, with different Z
             # values, arranged into horizontal bars
             attr_accessor :tileset
             attr_accessor :map_data
             attr_accessor :priorities
             attr_accessor :autotiles
             attr_accessor :bitmaps
             attr_accessor :pitch
             attr_accessor :ox
             attr_accessor :oy
             attr_accessor :plus_y
             INDEX = # Autotile definitions
             [
             26, 27, 32, 33, 4, 27, 32, 33, 26, 5, 32, 33, 4, 5, 32, 33,
             26, 27, 32, 11, 4, 27, 32, 11, 26, 5, 32, 11, 4, 5, 32, 11,
             26, 27, 10, 33, 4, 27, 10, 33, 26, 5, 10, 33, 4, 5, 10, 33,
             26, 27, 10, 11, 4, 27, 10, 11, 26, 5, 10, 11, 4, 5, 10, 11,
             24, 25, 30, 31, 24, 5, 30, 31, 24, 25, 30, 11, 24, 5, 30, 11,
             14, 15, 20, 21, 14, 15, 20, 11, 14, 15, 10, 21, 14, 15, 10, 11,
             28, 29, 34, 35, 28, 29, 10, 35, 4, 29, 34, 35, 4, 29, 10, 35,
             38, 39, 44, 45, 4, 39, 44, 45, 38, 5, 44, 45, 4, 5, 44, 45,
             24, 29, 30, 35, 14, 15, 44, 45, 12, 13, 18 ,19, 12, 13, 18, 11,
             16, 17, 22, 23, 16, 17, 10, 23, 40, 41, 46, 47, 4, 41, 46, 47,
             36, 37, 42, 43, 36, 5, 42, 43, 12, 17, 18, 23, 12, 13, 42, 43,
             36, 41, 42, 47, 16, 17, 46, 47, 12, 17, 42, 47, 0, 1, 6, 7
             ]
             X = [0, 1, 0, 1] # Used in 16x16 autotile drawing; left, right, left, right
             Y = [0, 0, 1, 1] # Used in 16x16 autotile drawing; up, up, down, down
             #-----------------------------------------------------------------------------
             def initialize
             # Get initial data from Game_Map
             @tileset = RPG::Cache.tileset($game_map.tileset_name)
             @map_data = $game_map.data
             @priorities = $game_map.priorities
             @autotiles = []
             for i in 0..6
             @autotiles[i] = RPG::Cache.autotile($game_map.autotile_names[i])
             end
             # Provide blank data in proper object form
             @ox = 0
             @oy = 0
             # Bitmaps used for each priority's drawing. Priorities 2-5 are combined.
             @bitmaps = [Bitmap.new($game_map.width*32, $game_map.height*32+$strip_size),
            


            6楼2008-04-25 18:14
            回复
               Bitmap.new($game_map.width*32, $game_map.height*32+$strip_size),
               Bitmap.new($game_map.width*32, $game_map.height*32+$strip_size)]
               # Generate blank sprites
               @sprites = [[], [], []]
               for i in 0..2 # For each layer
               for j in 0..$game_map.height * (32 / $strip_size) - 1
               # For each horizontal strip of $strip_size height, make a blank sprite
               @sprites[i].push(Sprite.new)
               @sprites[i][j].bitmap = Bitmap.new($game_map.width*32, $strip_size*2)
               @sprites[i][j].x = $width / 2
               @sprites[i][j].y = -64
               @sprites[i][j].z = -5 + (i * 10)
               end
               end
               @disposed = false
               draw
               end
               #-----------------------------------------------------------------------------
               def update
               # Retrieve variable values for slant drawing; these values accesible by event
               @pitch = $game_map.pitch.to_f
               @plus_y = $game_map.plus_y
               for i in 0..2 # For each layer
               for j in [0, (($height / 2) - (($height * 60) /
               @pitch) + @oy) / $strip_size].max.to_i..[@sprites[i].size - 1,
               (@oy + $height) / $strip_size].min.to_i
               # For each strip within the visible screen, update OX/Y
               @sprites[i][j].x = $width / 2
               @sprites[i][j].y = j * $strip_size - @oy
               unless @pitch == 0 # Apply X Zoom
               @sprites[i][j].zoom_x = (@sprites[i][j].y - $height / 2) *
               (@pitch / ($height * 25)) + 1
               if $curve # Zoom Y values same as X, and compensate
               @sprites[i][j].zoom_y = @sprites[i][j].zoom_x
               @sprites[i][j].y += $strip_size * (1 - @sprites[i][j].zoom_y) *
               ((1 - @sprites[i][j].zoom_y) /
               (2 * ((@pitch / 100) /
               ($height / ($strip_size * 2)))) + 0.5)
               end
               end
               @sprites[i][j].ox = @ox + $width / 2
               # Add plus_y value; used in airship script
               @sprites[i][j].y += @plus_y
               end
               end
               end
               #-----------------------------------------------------------------------------
               def dispose
               # Dispose all sprites
               for i in 0..2
               for j in @sprites[i]
               j.bitmap.dispose
               j.dispose
               end
               end
               for i in @bitmaps
               i.dispose
               end
               @tileset.dispose
               for i in 0..6
               @autotiles[i].dispose
               end
               @disposed = true
               end
               #-----------------------------------------------------------------------------
               def disposed?
               return @disposed
               end
               #-----------------------------------------------------------------------------
               def draw
               # Draw each individual position by XY value
               for x in 0...@map_data.xsize
               for y in 0...@map_data.ysize
               draw_position(x, y)
               end
               end
               for i in 0..2 # For each priority
               for j in 0..@sprites[i].size - 1
               # For each horizontal strip, transfer the bitmap appropriately
               @sprites[i][j].bitmap.blt(0, 0, @bitmaps[i],
               Rect.new(0, j * $strip_size, $game_map.width * 32, $strip_size * 2))
               end
               end
               end
               #-----------------------------------------------------------------------------
               def draw_position(x, y)
               for layer in 0..2
               pos = @map_data[x, y, layer]
               @priorities[pos] = 2 if @priorities[pos] > 2 # Round priorities down to 2
               if pos >= 384 # If it is a tile
               # src_rect = 32x32 Rect on the tileset for source bitmap
               src_rect = Rect.new(((pos-384)%8)*32, ((pos-384)/8)*32, 32, 32)
               # Transfer source bitmap on the tileset to the current map tile
              


              7楼2008-04-25 18:14
              回复
                 @bitmaps[@priorities[pos]].blt(x * 32, y * 32, @tileset, src_rect)
                 elsif pos >= 48 and pos < 384 # If it is an autotile
                 id = pos / 48 - 1 # Which autotile is used (0-6)
                 # plus_x is in development for animated autotiles
                 plus_x = 0 #((@anim / 4) % (@autotiles[id].width / 96)) * 96
                 for corner in 0..3
                 h = 4 * (pos % 48) + corner # Used to access INDEX
                 # src_rect = 16x16 Rect on the autotile for source bitmap
                 src_rect = Rect.new((INDEX[h]%6)*16+plus_x, (INDEX[h]/6)*16, 16, 16)
                 # Transfer source bitmap on the autotile to the current 16x16 tile
                 @bitmaps[@priorities[pos]].blt(x*32+X[corner]*16, y*32+Y[corner]*16,
                 @autotiles[id], src_rect)
                 end
                 end
                 end
                 end
                end
                #===============================================================================
                class Game_Map
                 attr_accessor :pitch
                 attr_accessor :plus_y
                 #-----------------------------------------------------------------------------
                 alias setup_or :setup
                 def setup(map_id)
                 setup_or(map_id)
                 @pitch = $data_map[$game_map.map_id].pitch
                 @plus_y = 0
                 end
                 #-----------------------------------------------------------------------------
                 def name
                 return $data_map[@map_id].name
                 end
                end
                #===============================================================================
                class Sprite_Character < RPG::Sprite
                 attr_accessor :character
                 #-----------------------------------------------------------------------------
                 def initialize(character = nil)
                 super()
                 @character = character
                 update
                 end
                 #-----------------------------------------------------------------------------
                 alias update_or :update
                 def update
                 update_or
                 # Update pitch value, and update zoom values to match
                 @pitch = $data_map[$game_map.map_id].pitch.to_f
                 self.zoom_x =
                 self.zoom_y = ((@character.screen_y - 16) - ($height / 2)) *
                 (@pitch / ($height * 25)) + 1
                 # Set sprite coordinates. X value is multiplied by zoom value from the center
                 self.x = ($width / 2) + ((@character.screen_x - ($width / 2)) * self.zoom_x)
                 self.y = @character.screen_y
                 # Add Y value for zoom compensation while in curve mode
                 if $curve and @pitch != 0
                 self.y += (8 * (1 - self.zoom_y) * ((1 - self.zoom_y) /
                 (2 * ((@pitch / 100) / ($height / 16.0))) + 0.5))
                 end
                 # Add plus_y value; used in airship script
                 self.y += $game_map.plus_y unless @character.is_a?(Game_Player)
                 self.z = @character.screen_z(@ch) - (self.zoom_y < 0.5 ? 1000 : 0)
                 if $data_map[$game_map.map_id].overworld? and
                 @character.is_a?(Game_Player) # Multiply zoom by Overworld factor if
                 self.zoom_x *= $ov_zoom # the map is marked with [OV] and event
                 self.zoom_y *= $ov_zoom # is a Game_Player
                 end
                 end
                end
                #===============================================================================
                class Spriteset_Map
                 def initialize
                 # Make viewports
                 @viewport1 = Viewport.new(0, 0, 640, 480)
                 @viewport2 = Viewport.new(0, 0, 640, 480)
                 @viewport3 = Viewport.new(0, 0, 640, 480)
                 @viewport2.z = 2000
                 @viewport3.z = 5000
                 # Make tilemap
                 @tilemap = Draw_Tilemap.new
                 # Make panorama plane
                 @panorama = Plane.new
                 @panorama.z = -2000
                 # Make fog plane
                 @fog = Plane.new
                 @fog.z = 3000
                 # Make character sprites
                 @character_sprites = []
                 for i in $game_map.events.keys.sort
                 sprite = Sprite_Character.new($game_map.events[i])
                 @character_sprites.push(sprite)
                 end
                 @character_sprites.push(Sprite_Character.new($game_player))
                 # Make weather
                 @weather = RPG::Weather.new(@viewport1)
                 # Make picture sprites
                 @picture_sprites = []
                 for i in 1..50
                 @picture_sprites.push(Sprite_Picture.new(@viewport2,
                 $game_screen.pictures[i]))
                 end
                 # Make timer sprite
                 @timer_sprite = Sprite_Timer.new
                 # Frame update
                 update
                 end
                 #-----------------------------------------------------------------------------
                 def dispose
                 # Dispose of tilemap
                 @tilemap.dispose
                 # Dispose of panorama plane
                 @panorama.dispose
                 # Dispose of fog plane
                 @fog.dispose
                 # Dispose of character sprites
                 for sprite in @character_sprites
                 sprite.dispose
                 end
                 # Dispose of weather
                 @weather.dispose
                 # Dispose of picture sprites
                 for sprite in @picture_sprites
                 sprite.dispose
                 end
                 # Dispose of timer sprite
                 @timer_sprite.dispose
                 # Dispose of viewports
                 @viewport1.dispose
                 @viewport2.dispose
                 @viewport3.dispose
                 end
                end


                8楼2008-04-25 18:14
                回复
                  =begin

                  Mode07 on the Map!
                  Includes:
                   Mode07 v0.6
                   Overworld Sprite Resize
                   Written by mewsterus

                  Special Thanks:
                   Fanha Giang (for a reverse engineered Tilemap class)
                  --------------------------------------------------------------------------------
                  Instructions:
                  --------------------------------------------------------------------------------
                  To install, just insert this in a descriptive code slot right above Main.
                   This is different than previous instructions; please read the next paragraph.

                  If you had a previous install of this script and need an original version of
                   Spriteset_Map, one can be found at:
                   http://www.rpg-palace.com/scripts/spriteset_map.txt

                  To activate Mode07, add [#XX] to the map's name, replacing XX with the
                   percentage of Mode07 to apply. Greater numbers will result in a more slanted
                   world.
                   
                  To activate overworld sprite resize, add [OV] to the map's name. This will make
                   sprites smaller on that map.

                  For the purposes of location scripts, these identifiers will not appear.


                  Examples:

                  "Overworld[#40]" will result in a slant identical to the second screenshot.
                  "Underworld[OV]" will resize only the player character to a small size, as if
                   seen from high above.
                  "Atthelevelworld[OV][#12]" will result in the player being resized, and a modest
                   slant of 12%
                  "JustPlainWorld" will result in the same old map you've always seen.

                  To add a sky, simply use the panorama with the tileset. Also, events will not
                   be drawn flat with the map. Any vertical objects such as trees should be put
                   in events and displayed that way.

                  You can also add a sky by adding a fog. If you add this, you can make it look
                   like the first screenshot.

                  A note on the $strip_size variable; the default value is 8, however there is
                   extremely minimal, almost nonexistant lag with 16. The screen is extremely
                   smooth with 4, or even 2. If you're having major problems with lag, you may
                   need to use 32, but it won't look too pretty.
                  --------------------------------------------------------------------------------
                  * Draw_Tilemap v1.72-0.6
                  Fanha Giang, 02/12/2006 (mm/dd/yyyy)
                  Edited for Mode07 by mewsterus 08/08/2006 (mm/dd/yyyy)
                  =end
                  #===============================================================================
                  $width = 640 # Screen width (will not change resolution,
                  $height = 480 # Screen height here for compatibility)
                  $ov_zoom = 0.6 # Overworld zoom multiplier
                  $strip_size = 8 # Size of each strip of the map. Higher numbers will lag less.
                   # Recommended that this number be a power of 2.
                   # Do not make higher than 64.
                  $curve = true # Whether the map is curled, for overworlds (old method)
                  $data_map = load_data("Data/MapInfos.rxdata")
                  #===============================================================================
                  class RPG::MapInfo
                   def name # Definition prevents location scripts from reading anything within
                   return @name.gsub(/\[.*\]/) {""} # brackets, including the brackets
                   end
                   #-----------------------------------------------------------------------------
                   def original_name
                  


                  9楼2008-04-25 18:14
                  回复
                     return @name
                     end
                     #-----------------------------------------------------------------------------
                     def overworld?
                     return @name.scan(/[OV]/).size > 0
                     end
                     #-----------------------------------------------------------------------------
                     def pitch
                     @name =~ /\[#[ ]*([00-99]+)\]/i
                     return $1
                     end
                    end
                    #===============================================================================
                    class Draw_Tilemap # This class controls a set of sprites, with different Z
                     # values, arranged into horizontal bars
                     attr_accessor :tileset
                     attr_accessor :map_data
                     attr_accessor :priorities
                     attr_accessor :autotiles
                     attr_accessor :bitmaps
                     attr_accessor :pitch
                     attr_accessor :ox
                     attr_accessor :oy
                     attr_accessor :plus_y
                     INDEX = # Autotile definitions
                     [
                     26, 27, 32, 33, 4, 27, 32, 33, 26, 5, 32, 33, 4, 5, 32, 33,
                     26, 27, 32, 11, 4, 27, 32, 11, 26, 5, 32, 11, 4, 5, 32, 11,
                     26, 27, 10, 33, 4, 27, 10, 33, 26, 5, 10, 33, 4, 5, 10, 33,
                     26, 27, 10, 11, 4, 27, 10, 11, 26, 5, 10, 11, 4, 5, 10, 11,
                     24, 25, 30, 31, 24, 5, 30, 31, 24, 25, 30, 11, 24, 5, 30, 11,
                     14, 15, 20, 21, 14, 15, 20, 11, 14, 15, 10, 21, 14, 15, 10, 11,
                     28, 29, 34, 35, 28, 29, 10, 35, 4, 29, 34, 35, 4, 29, 10, 35,
                     38, 39, 44, 45, 4, 39, 44, 45, 38, 5, 44, 45, 4, 5, 44, 45,
                     24, 29, 30, 35, 14, 15, 44, 45, 12, 13, 18 ,19, 12, 13, 18, 11,
                     16, 17, 22, 23, 16, 17, 10, 23, 40, 41, 46, 47, 4, 41, 46, 47,
                     36, 37, 42, 43, 36, 5, 42, 43, 12, 17, 18, 23, 12, 13, 42, 43,
                     36, 41, 42, 47, 16, 17, 46, 47, 12, 17, 42, 47, 0, 1, 6, 7
                     ]
                     X = [0, 1, 0, 1] # Used in 16x16 autotile drawing; left, right, left, right
                     Y = [0, 0, 1, 1] # Used in 16x16 autotile drawing; up, up, down, down
                     #-----------------------------------------------------------------------------
                     def initialize
                     # Get initial data from Game_Map
                     @tileset = RPG::Cache.tileset($game_map.tileset_name)
                     @map_data = $game_map.data
                     @priorities = $game_map.priorities
                     @autotiles = []
                     for i in 0..6
                     @autotiles[i] = RPG::Cache.autotile($game_map.autotile_names[i])
                     end
                     # Provide blank data in proper object form
                     @ox = 0
                     @oy = 0
                     # Bitmaps used for each priority's drawing. Priorities 2-5 are combined.
                     @bitmaps = [Bitmap.new($game_map.width*32, $game_map.height*32+$strip_size),
                     Bitmap.new($game_map.width*32, $game_map.height*32+$strip_size),
                     Bitmap.new($game_map.width*32, $game_map.height*32+$strip_size)]
                     # Generate blank sprites
                     @sprites = [[], [], []]
                     for i in 0..2 # For each layer
                     for j in 0..$game_map.height * (32 / $strip_size) - 1
                     # For each horizontal strip of $strip_size height, make a blank sprite
                     @sprites[i].push(Sprite.new)
                     @sprites[i][j].bitmap = Bitmap.new($game_map.width*32, $strip_size*2)
                     @sprites[i][j].x = $width / 2
                     @sprites[i][j].y = -64
                     @sprites[i][j].z = -5 + (i * 10)
                     end
                     end
                     @disposed = false
                     draw
                     end
                     #-----------------------------------------------------------------------------
                     def update
                     # Retrieve variable values for slant drawing; these values accesible by event
                     @pitch = $game_map.pitch.to_f
                     @plus_y = $game_map.plus_y
                    


                    10楼2008-04-25 18:14
                    回复
                       for i in 0..2 # For each layer
                       for j in [0, (($height / 2) - (($height * 60) /
                       @pitch) + @oy) / $strip_size].max.to_i..[@sprites[i].size - 1,
                       (@oy + $height) / $strip_size].min.to_i
                       # For each strip within the visible screen, update OX/Y
                       @sprites[i][j].x = $width / 2
                       @sprites[i][j].y = j * $strip_size - @oy
                       unless @pitch == 0 # Apply X Zoom
                       @sprites[i][j].zoom_x = (@sprites[i][j].y - $height / 2) *
                       (@pitch / ($height * 25)) + 1
                       if $curve # Zoom Y values same as X, and compensate
                       @sprites[i][j].zoom_y = @sprites[i][j].zoom_x
                       @sprites[i][j].y += $strip_size * (1 - @sprites[i][j].zoom_y) *
                       ((1 - @sprites[i][j].zoom_y) /
                       (2 * ((@pitch / 100) /
                       ($height / ($strip_size * 2)))) + 0.5)
                       end
                       end
                       @sprites[i][j].ox = @ox + $width / 2
                       # Add plus_y value; used in airship script
                       @sprites[i][j].y += @plus_y
                       end
                       end
                       end
                       #-----------------------------------------------------------------------------
                       def dispose
                       # Dispose all sprites
                       for i in 0..2
                       for j in @sprites[i]
                       j.bitmap.dispose
                       j.dispose
                       end
                       end
                       for i in @bitmaps
                       i.dispose
                       end
                       @tileset.dispose
                       for i in 0..6
                       @autotiles[i].dispose
                       end
                       @disposed = true
                       end
                       #-----------------------------------------------------------------------------
                       def disposed?
                       return @disposed
                       end
                       #-----------------------------------------------------------------------------
                       def draw
                       # Draw each individual position by XY value
                       for x in 0...@map_data.xsize
                       for y in 0...@map_data.ysize
                       draw_position(x, y)
                       end
                       end
                       for i in 0..2 # For each priority
                       for j in 0..@sprites[i].size - 1
                       # For each horizontal strip, transfer the bitmap appropriately
                       @sprites[i][j].bitmap.blt(0, 0, @bitmaps[i],
                       Rect.new(0, j * $strip_size, $game_map.width * 32, $strip_size * 2))
                       end
                       end
                       end
                       #-----------------------------------------------------------------------------
                       def draw_position(x, y)
                       for layer in 0..2
                       pos = @map_data[x, y, layer]
                       @priorities[pos] = 2 if @priorities[pos] > 2 # Round priorities down to 2
                       if pos >= 384 # If it is a tile
                       # src_rect = 32x32 Rect on the tileset for source bitmap
                       src_rect = Rect.new(((pos-384)%8)*32, ((pos-384)/8)*32, 32, 32)
                       # Transfer source bitmap on the tileset to the current map tile
                       @bitmaps[@priorities[pos]].blt(x * 32, y * 32, @tileset, src_rect)
                       elsif pos >= 48 and pos < 384 # If it is an autotile
                       id = pos / 48 - 1 # Which autotile is used (0-6)
                       # plus_x is in development for animated autotiles
                       plus_x = 0 #((@anim / 4) % (@autotiles[id].width / 96)) * 96
                       for corner in 0..3
                       h = 4 * (pos % 48) + corner # Used to access INDEX
                       # src_rect = 16x16 Rect on the autotile for source bitmap
                       src_rect = Rect.new((INDEX[h]%6)*16+plus_x, (INDEX[h]/6)*16, 16, 16)
                       # Transfer source bitmap on the autotile to the current 16x16 tile
                       @bitmaps[@priorities[pos]].blt(x*32+X[corner]*16, y*32+Y[corner]*16,
                       @autotiles[id], src_rect)
                       end
                       end
                       end
                       end
                      end
                      #===============================================================================
                      class Game_Map
                       attr_accessor :pitch
                      


                      11楼2008-04-25 18:14
                      回复
                         attr_accessor :plus_y
                         #-----------------------------------------------------------------------------
                         alias setup_or :setup
                         def setup(map_id)
                         setup_or(map_id)
                         @pitch = $data_map[$game_map.map_id].pitch
                         @plus_y = 0
                         end
                         #-----------------------------------------------------------------------------
                         def name
                         return $data_map[@map_id].name
                         end
                        end
                        #===============================================================================
                        class Sprite_Character < RPG::Sprite
                         attr_accessor :character
                         #-----------------------------------------------------------------------------
                         def initialize(character = nil)
                         super()
                         @character = character
                         update
                         end
                         #-----------------------------------------------------------------------------
                         alias update_or :update
                         def update
                         update_or
                         # Update pitch value, and update zoom values to match
                         @pitch = $data_map[$game_map.map_id].pitch.to_f
                         self.zoom_x =
                         self.zoom_y = ((@character.screen_y - 16) - ($height / 2)) *
                         (@pitch / ($height * 25)) + 1
                         # Set sprite coordinates. X value is multiplied by zoom value from the center
                         self.x = ($width / 2) + ((@character.screen_x - ($width / 2)) * self.zoom_x)
                         self.y = @character.screen_y
                         # Add Y value for zoom compensation while in curve mode
                         if $curve and @pitch != 0
                         self.y += (8 * (1 - self.zoom_y) * ((1 - self.zoom_y) /
                         (2 * ((@pitch / 100) / ($height / 16.0))) + 0.5))
                         end
                         # Add plus_y value; used in airship script
                         self.y += $game_map.plus_y unless @character.is_a?(Game_Player)
                         self.z = @character.screen_z(@ch) - (self.zoom_y < 0.5 ? 1000 : 0)
                         if $data_map[$game_map.map_id].overworld? and
                         @character.is_a?(Game_Player) # Multiply zoom by Overworld factor if
                         self.zoom_x *= $ov_zoom # the map is marked with [OV] and event
                         self.zoom_y *= $ov_zoom # is a Game_Player
                         end
                         end
                        end
                        #===============================================================================
                        class Spriteset_Map
                         def initialize
                         # Make viewports
                         @viewport1 = Viewport.new(0, 0, 640, 480)
                         @viewport2 = Viewport.new(0, 0, 640, 480)
                         @viewport3 = Viewport.new(0, 0, 640, 480)
                         @viewport2.z = 2000
                         @viewport3.z = 5000
                         # Make tilemap
                         @tilemap = Draw_Tilemap.new
                         # Make panorama plane
                         @panorama = Plane.new
                         @panorama.z = -2000
                         # Make fog plane
                         @fog = Plane.new
                         @fog.z = 3000
                         # Make character sprites
                         @character_sprites = []
                         for i in $game_map.events.keys.sort
                         sprite = Sprite_Character.new($game_map.events[i])
                         @character_sprites.push(sprite)
                         end
                         @character_sprites.push(Sprite_Character.new($game_player))
                         # Make weather
                         @weather = RPG::Weather.new(@viewport1)
                         # Make picture sprites
                         @picture_sprites = []
                         for i in 1..50
                         @picture_sprites.push(Sprite_Picture.new(@viewport2,
                         $game_screen.pictures[i]))
                         end
                         # Make timer sprite
                         @timer_sprite = Sprite_Timer.new
                         # Frame update
                         update
                         end
                         #-----------------------------------------------------------------------------
                         def dispose
                         # Dispose of tilemap
                         @tilemap.dispose
                         # Dispose of panorama plane
                         @panorama.dispose
                         # Dispose of fog plane
                         @fog.dispose
                         # Dispose of character sprites
                         for sprite in @character_sprites
                         sprite.dispose
                         end
                         # Dispose of weather
                         @weather.dispose
                         # Dispose of picture sprites
                         for sprite in @picture_sprites
                         sprite.dispose
                         end
                         # Dispose of timer sprite
                         @timer_sprite.dispose
                         # Dispose of viewports
                         @viewport1.dispose
                         @viewport2.dispose
                         @viewport3.dispose
                         end
                        end


                        12楼2008-04-25 18:14
                        收起回复