赞 | 0 |
VIP | 0 |
好人卡 | 0 |
积分 | 1 |
经验 | 4095 |
最后登录 | 2012-5-26 |
在线时间 | 2 小时 |
Lv1.梦旅人
- 梦石
- 0
- 星屑
- 50
- 在线时间
- 2 小时
- 注册时间
- 2006-3-1
- 帖子
- 126
|
加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
图片
脚本是不是将系统改成如图????
- =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
- 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
- #-----------------------------------------------------------------------------
- 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
- @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
复制代码 |
|