Jump to content
Rpg²S Forum

Luigi

Utenti
  • Posts

    150
  • Joined

  • Last visited

Posts posted by Luigi

  1. Creato da Mewsterus

     

    Questo script ricrea un effeto semi 3d veramente meraviglioso..soprattutto perchè potrete usarlo solo quando volete...ma andiamo al dunque...Ecco 2 screens per farvi capire meglio..

     

    http://img332.imageshack.us/img332/557/mode70uy.jpg

     

    http://img78.imageshack.us/img78/4987/mode736ul.jpg

     

    Istruzioni per l'uso:

    Vi riporto ciò che è stato scritto dal creatore dello script..

    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 here. One more thing has changed; read on through the next paragraph.

     

    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.

     

    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.

     

     

    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.

     

    E adesso il tanto atteso Script:

     

    =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

×
×
  • Create New...