Jump to content
Rpg²S Forum

*Mode07


Luigi
 Share

Recommended Posts

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

Edited by Luigi
Link to comment
Share on other sites

Se non erro, questo script era già stato postato.

E in ogni caso, questa non era proprio la sezione giusta.

 

Comunque, Bello. Questo Finto 3-D è affascinante.

~ R²S ~ - '°•o Realizing Random Scrips o•°'

Link to comment
Share on other sites

Ho spostato nella sezione giusta.

Cmq sia questo script é ottimo (per orsa) solo per le mappe del mondo... a meno che non si usino chip simil 3D il risultato (con chip nomrlai) non é dei migliori...

 

Aspettiamo aggiornamenti quindi ^^

http://www.browsergamer.net/banner/190x60/browsergamer.jpg http://www.medioshopping.com/img/medioshopping_logo_mini.png

 

www.havana24.net

Premi vinti

 

 

http://www.rpg2s.net/gif/GC_bestof1.gif http://www.rpg2s.net/gif/GC_bestoftool1.gif

http://www.rpg2s.net/gif/GC_musica3.gif http://www.rpg2s.net/gif/GC_effettispeciali1.gif http://www.rpg2s.net/gif/GC_effettispeciali1.gif http://www.rpg2s.net/gif/GC_gameplay2.gif http://www.rpg2s.net/gif/GC_mapping1.gif http://www.rpg2s.net/gif/GC_programmazione1.gif http://www.rpg2s.net/gif/GC_programmazione1.gif http://www.rpg2s.net/gif/GC_trama1.gif http://www.rpg2s.net/gif/GC_grafica1.gif http://www.rpg2s.net/gif/GC_grafica1.gif http://www.rpg2s.net/gif/GC_premio3.gif http://www.rpg2s.net/gif/GC_premio3.gif http://www.rpg2s.net/gif/GC_premio1.gif http://www.rpg2s.net/gif/GC_premio1.gif http://www.rpg2s.net/gif/GC_premio1.gif http://www.rpg2s.net/gif/GC_premio1.gif

 

http://www.rpg2s.net/awards/bestgraphic1.jpg http://www.rpg2s.net/awards/bestmaker1.jpg

http://www.rpg2s.net/awards/bestmapper1.jpg http://www.rpg2s.net/awards/bestprogrammer3.jpg

http://rpg2s.net/gif/SCContest1Oct.gif http://i54.tinypic.com/15cikht.gif http://img42.imageshack.us/img42/3015/terzoposto.png

 

 

Link to comment
Share on other sites

Scusate,ho un piccolo problemino.Con questo script,Attivo o meno,quando porto la

tonalità schermo a 0(Per qualche evento)I Pg ed avvolte anche alcuni oggetti(Forse quelli

del secondo o terzo LV,rimangono chiari.Come potrei correggere il problema?

 

Ps

Bella la barca volante dello screen,dove la posso trovare?

Edited by Extreme Z
Link to comment
Share on other sites

2 domande.

1. è possibile far ruotare la visuale della mappa (come nel vero mode7 dello snes)?

2. le picture come vengono visualizzate (a dimensioni normali, rimpicciolite in base alla distanza del centro dell'immagine, appiattite al terreno.. ecc)?

 

grazie.

ex-lev

 

http://www.rpg2s.net/forum/uploads/monthly_04_2008/post-256-1207331778.gif

 

Adottare una gigacciola?!? Ecco cosa ne penso io:

_____________http://img386.imageshack.us/img386/2594/gigacciolaje7.gif

giorni mesi anni interi mi han fottuto dietro i banchi

mi han rubato la passione maledetti governanti

ma adesso mi organizzo per la nuova libertà

« anarcofricchettanza da domani…vencerá! »

 

tratto da "Anarcosong - Osteria Popolare Berica"

 

 

 

๑۩۞۩๑

http://www.rpg2s.net/awards/bestcritical3.jpg

Link to comment
Share on other sites

me ne sono accorto ora, esisteva già il topic QUI

 

con tanto di demo xD

ex-lev

 

http://www.rpg2s.net/forum/uploads/monthly_04_2008/post-256-1207331778.gif

 

Adottare una gigacciola?!? Ecco cosa ne penso io:

_____________http://img386.imageshack.us/img386/2594/gigacciolaje7.gif

giorni mesi anni interi mi han fottuto dietro i banchi

mi han rubato la passione maledetti governanti

ma adesso mi organizzo per la nuova libertà

« anarcofricchettanza da domani…vencerá! »

 

tratto da "Anarcosong - Osteria Popolare Berica"

 

 

 

๑۩۞۩๑

http://www.rpg2s.net/awards/bestcritical3.jpg

Link to comment
Share on other sites

  • 1 month later...
  • 4 years later...

non per necropostare, ma non riesco a far funzionare questo script.

Aggiungo tutto su Main, creo una nuova mappa (anche grandi e anche piccole, ne ho provate di tutte), eppure mettendo il [#XX] con il numero o [OV] dopo il nome della mappa. La mappa va e si vede, ma l'effetto non c'è.

Siccome la demo postata sull'altro topic era su megaupload, causa la sua chiusura non posso più scaricare la demo. ç_______ç

Qualcuno se ha la demo la può riuppare o mi spiega cosa ho sbagliato?

.


"Hurry up, we're dreaming."


Soundcloud Page

Link to comment
Share on other sites

EaglEye, non ti preoccupare non è necropost se si posta per segnalare un non funzionamento, comunque la versione postata in questo topic è molto vecchia e probabilmente anche buggata...prova a inserire nel nome della mappa anche il tag [M7]...io non l'ho provata però ti linko quella che ho provato io, che è più recente e funzionante:

Neo-Mode7

probabilmente se fai un giro sui forum stranieri trovi versioni ancora più aggiornate :wink:

Edited by Dilos
Link to comment
Share on other sites

Pensi che la causa del problema sia la versione di RPG Maker? Prova può essere quello non ci avevo pensato :sisi:

Ma prova anche la Neo-Mode07, peggio di questa non può essere :sisi:

Link to comment
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
 Share

×
×
  • Create New...