Sign in to follow this  
Followers 0
Luxor

Un script de mapa en prespectiva

33 posts in this topic

Es un muy buen script para ver la perspectiva en el mapa...

Imagenes:

user posted image
user posted image
user posted image

Script:

CODE
=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)

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.  The numbers for this feature have been expanded, such that any numbers
will be halved.  Take note; if you once used [#24], it will now be [#12] for
the same appearance.  All numbers should be halved.

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 picture.  If you add this picture, you can
make it look even better, with a curved world and sunlight, and it will not
move with the map.
--------------------------------------------------------------------------------
* 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


Uso:

*En el nombre del mapa que queramos en prespectiva se pone al final [#80] siendo 80 el número de la angulación de la prespectiva. Si es 80 quedará como la segunda imagen.
si en el nombre del mapa ponemos [OV] el personaje aparecerá en pequeñito.

Estos dos comandos se pueden combinar, y si no se pone ninguno aparecerá normal.

Aviso: los objetos del tile que se supongan encima del personaje no se mostrarán sobre este.

Para poner objetos que se situen por encima del personaje, usad characters.

Chao
0

Share this post


Link to post
Share on other sites
Esto le vendría bien a los que hacen juegos a lo Final Fantasy. Muy bueno, lo iba a postear yo casi ahora. xDD
0

Share this post


Link to post
Share on other sites
Yo os lo dejé porque sabía que lo pondríais. Yo mismo le comenté su existencia a un grupo de personas por separado. El título original del script era Efecto 3D en el mapa. happy.gif
0

Share this post


Link to post
Share on other sites
esto es algo asi como cuando montan en chokobo en el ff6?
0

Share this post


Link to post
Share on other sites
Esto pone los mapas en perspectiva dando una impresión 3D, o por lo menos de mini-mundo.
0

Share this post


Link to post
Share on other sites
mmm interesante
0

Share this post


Link to post
Share on other sites
¿Verdad que sí? Pero tenías las screens, podías haberlas mirado detenidamente. xD
0

Share this post


Link to post
Share on other sites
la primera esta increible pero viendolas me imagine eso del aplanado xDD
0

Share this post


Link to post
Share on other sites
Yo lo trate de usar en mi mapa mundi pero me decia un error de "Script Desbordado" antes de empezar a jugar y se cerraba el juego, sera por que mi mapa mundi es muy grande? o a que se puede deber?
0

Share this post


Link to post
Share on other sites
uuuoooo el rey de los scrips de wormap auxilio.gif blink.gif

lo ideal seria que se puediera combinar con el scrip de mapa del mundo infinito, el de que apareces al otro lado del mundo y parece que nunca se acaba
0

Share this post


Link to post
Share on other sites
No se si se puede... yo no tengo mapamundo ahora...
Y lo de script desbordado... ¿alguna situación no permitida? huh.gif
0

Share this post


Link to post
Share on other sites
nose donde lo vi pero bue buen script

P.D. el barco ta atravesando la tienrra impresionado.gif impresionado.gif
0

Share this post


Link to post
Share on other sites
mapa del mundo infinito??!!!! traetelo tengo tiempo buscandolo
0

Share this post


Link to post
Share on other sites
Lo que hace realmente es que cuando llegas a un límite del mapa sales al otro lado... No se dónde está... así que lo tendrá que traer edugonrod.
0

Share this post


Link to post
Share on other sites
o sea ke das la vuelta como si fuese redondo trae paca xD.png
0

Share this post


Link to post
Share on other sites
Con este no, con el que no está posteado...
0

Share this post


Link to post
Share on other sites
seria exelente un script asi al estilo final fnatasy de un planeta redondo y no cuadrado xD.png
0

Share this post


Link to post
Share on other sites
pues yo e puesto ste script y se me a fastidiado el juego... ya no se abre de ninguna manera le doy a probar juego y sin poner nada se queda negro y se va
0

Share this post


Link to post
Share on other sites
pero ay un limite para que se pueda usar no? creo que si un mapa sobrepasa los 100x100 dice que se desborda el script, por eso no lo use...
0

Share this post


Link to post
Share on other sites
pos que penano me habia pasado antes disculpa DraKo no lo vi y tampoco me di cuenta que me cerraste el otro solo pense que se habia borrado o que no lo habia creado bien, en todo caso ya saben que me gusta mucho lo de los airships y cosas de world map pero falta mensionar que este script no esta terminado y que aun tiene muchos busgs por ejemplo el mayor mapa que he logrado que corra es de 50x50 y no coren los mas pequeños ademas da lag como el solo la verdad es que no es funcional para nada mientras no se termine o alguien le meta la mano, esa era mi inquietud perdon de nuevo, en cuanto al sscript de mapa infinito si queren lo posteo pero me dicen si no se ha posteado antes en esta version de el foro. icon13.gif icon13.gif
0

Share this post


Link to post
Share on other sites
ya se posteo, de hecho yo lo postie jejeje, y ya esta en la recopilacion de scripts del darkdragonxxx o algo asi, pero se llama "Wrap Map" el script.
0

Share this post


Link to post
Share on other sites
este script ya lo tenia ... y tenia una gran bug, el personaje
atraviesa todo cheesy.gif...
aunque le pongas [x] a los tiles ....si no fuera por eso el script seria exelente


...:::~killuaXsama~:::...
0

Share this post


Link to post
Share on other sites
weee lo conbine con el warp map y me cago la makina, se volvio loca y tube que reinicar, les recomiendo que no lo hagan xD.png
0

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now
Sign in to follow this  
Followers 0