• Benvenuto in Making Videogames!
  • Dai sfogo alla tua fantasia!
  • Crea il tuo Videogioco!
Benvenuto ospite! Login Registrati




Valutazione discussione:
  • 0 voto(i) - 0 media
  • 1
  • 2
  • 3
  • 4
  • 5
Mappe infinite
#1
Wrap Map v2.0

Descrizione

Questo script permette di realizzare mappe "infinite": se il personaggio toccherà uno dei quattro lati della mappa, verrà automaticamente teletrasportato dall'altro capo. Per farlo funzionare dovete aggiungere al nome della mappa"_wrap".




Autore

Dirtie



Istruzioni per l'uso

Create una nuova classe sopra main e incollate al suo interno questo:

Codice:
#==============================================================================
# ■ Wrap_Map V2
#------------------------------------------------------------------------------
#  By Dirtie.
# Allows chosen map(s) to "wrap-around", ie. go continuously.
# Just add "_wrap" to the end of the map name for the map you want to be wrapped.
# Many thanks to Rataime for all the event code, Dubealex for helping me out,
# Deke for the map checker script, and to everyone else that contributed.
#==============================================================================

#--------------------------------------------------------------------------
# ▼ CLASS Game_Temp (edit)
# Script to check for "_wrap" in the map name.
# This is taken and modified from Deke's Day/Night and Time System script.
# If you would like to use something other than "_wrap" to check for,
# change _wrap to whatever you want on lines 30 and 34
#--------------------------------------------------------------------------
class Game_Temp

attr_reader :map_infos
attr_reader :outside_array

alias wrap_original_game_temp_initialize initialize

def initialize
wrap_original_game_temp_initialize
@map_infos = load_data("Data/MapInfos.rxdata")
@outside_array=Array.new
for key in @map_infos.keys
@outside_array[key]=@map_infos[key].name.include?("_wrap")
end
for key in @map_infos.keys
@map_infos[key] = @map_infos[key].name
@map_infos[key].delete!("_wrap")
end
end

end

#--------------------------------------------------------------------------
# ▼ CLASS Game_Map (edit)
# First, sets up the variable "wrap" for use in the event script later.
# Then checks to see if "_wrap" is in the map name;
# If not, uses default scrolling options for respective edge of map.
# If so, tells viewport to keep scrolling in the respective direction when actor is near edge of map.
#--------------------------------------------------------------------------
class Game_Map

attr_accessor :wrap

alias wrap_original_game_map_scroll_left scroll_left
alias wrap_original_game_map_scroll_right scroll_right
alias wrap_original_game_map_scroll_up scroll_up
alias wrap_original_game_map_scroll_down scroll_down

# Left
def scroll_left(distance)
unless $game_temp.outside_array[$game_map.map_id]
wrap_original_game_map_scroll_left(distance)
else
@display_x = [@display_x - distance].max
end
end

# Right
def scroll_right(distance)
unless $game_temp.outside_array[$game_map.map_id]
wrap_original_game_map_scroll_right(distance)
else
@display_x = [@display_x + distance].min
end
end

# Top
def scroll_up(distance)
unless $game_temp.outside_array[$game_map.map_id]
wrap_original_game_map_scroll_up(distance)
else
@display_y = [@display_y - distance].max
end
end

# Bottom
def scroll_down(distance)
unless $game_temp.outside_array[$game_map.map_id]
wrap_original_game_map_scroll_down(distance)
else
@display_y = [@display_y + distance].min
end
end

end

#--------------------------------------------------------------------------
# ▼ CLASS Game_Player (edit)
# Makes sure viewport stays centered on player, particularly when teleporting near edges.
#--------------------------------------------------------------------------
class Game_Player

alias wrap_original_game_player_center center

def center(x, y)
unless $game_temp.outside_array[$game_map.map_id]
wrap_original_game_player_center(x, y)
else
max_x = ($game_map.width + 20) * 128
max_y = ($game_map.height + 15) * 128
$game_map.display_x = [-20 * 128, [x * 128 - CENTER_X, max_x].min].max
$game_map.display_y = [-15 * 128, [y * 128 - CENTER_Y, max_y].min].max
end
end

end

#--------------------------------------------------------------------------
# ▼ CLASS Check_Coordinates
# Checks for coordinates and keyboard input, then teleports if conditions are met.
#--------------------------------------------------------------------------
class Check_Coordinates

#------------------------------------------------------------------------
# ● Handles left edge
#------------------------------------------------------------------------
def refresh_left
unless $game_temp.outside_array[$game_map.map_id]
else
if $game_player.real_x == 0
if Input.press?(Input::LEFT)
def $game_player.passable?(x, y, d)
return true
end
@left_trigger = true
end
end
end
end

#------------------------------------------------------------------------
# ● Handles right edge
#------------------------------------------------------------------------
def refresh_right
unless $game_temp.outside_array[$game_map.map_id]
else
@map_width_max = ($game_map.width - 1) * 128
if $game_player.real_x == @map_width_max
if Input.press?(Input::RIGHT)
def $game_player.passable?(x, y, d)
return true
end
@right_trigger = true
end
end
end
end

#------------------------------------------------------------------------
# ● Handles top edge
#------------------------------------------------------------------------
def refresh_top
unless $game_temp.outside_array[$game_map.map_id]
else
if $game_player.real_y == 0
if Input.press?(Input::UP)
def $game_player.passable?(x, y, d)
return true
end
@top_trigger = true
end
end
end
end

#------------------------------------------------------------------------
# ● Handles bottom edge
#------------------------------------------------------------------------
def refresh_bottom
unless $game_temp.outside_array[$game_map.map_id]
else
@map_height_max = ($game_map.height - 1) * 128
if $game_player.real_y == @map_height_max
if Input.press?(Input::DOWN)
def $game_player.passable?(x, y, d)
return true
end
@bottom_trigger = true
end
end
end
end

#------------------------------------------------------------------------
# ● Left teleport
#------------------------------------------------------------------------
def left_trigger
if @left_trigger == true
if $game_player.real_x == -128
$game_player.moveto(($game_map.width - 1), $game_player.y)
def $game_player.passable?(x, y, d)
new_x = x + (d == 6 ? 1 : d == 4 ? -1 : 0)
new_y = y + (d == 2 ? 1 : d == 8 ? -1 : 0)
unless $game_map.valid?(new_x, new_y)
return false
end
if $DEBUG and Input.press?(Input::CTRL)
return true
end
super
end
@left_trigger = false
end
end
end

#------------------------------------------------------------------------
# ● Right teleport
#------------------------------------------------------------------------
def right_trigger
if @right_trigger == true
if $game_player.real_x == ($game_map.width * 128)
$game_player.moveto(0, $game_player.y)
def $game_player.passable?(x, y, d)
new_x = x + (d == 6 ? 1 : d == 4 ? -1 : 0)
new_y = y + (d == 2 ? 1 : d == 8 ? -1 : 0)
unless $game_map.valid?(new_x, new_y)
return false
end
if $DEBUG and Input.press?(Input::CTRL)
return true
end
super
end
@right_trigger = false
end
end
end

#------------------------------------------------------------------------
# ● Top teleport
#------------------------------------------------------------------------
def top_trigger
if @top_trigger == true
if $game_player.real_y == -128
$game_player.moveto($game_player.x, ($game_map.height - 1))
def $game_player.passable?(x, y, d)
new_x = x + (d == 6 ? 1 : d == 4 ? -1 : 0)
new_y = y + (d == 2 ? 1 : d == 8 ? -1 : 0)
unless $game_map.valid?(new_x, new_y)
return false
end
if $DEBUG and Input.press?(Input::CTRL)
return true
end
super
end
@top_trigger = false
end
end
end

#------------------------------------------------------------------------
# ● Bottom teleport
#------------------------------------------------------------------------
def bottom_trigger
if @bottom_trigger == true
if $game_player.real_y == ($game_map.height * 128)
$game_player.moveto($game_player.x, 0)
def $game_player.passable?(x, y, d)
new_x = x + (d == 6 ? 1 : d == 4 ? -1 : 0)
new_y = y + (d == 2 ? 1 : d == 8 ? -1 : 0)
unless $game_map.valid?(new_x, new_y)
return false
end
if $DEBUG and Input.press?(Input::CTRL)
return true
end
super
end
@bottom_trigger = false
end
end
end

end

#--------------------------------------------------------------------------
# ▼ CLASS Sprite_Duplicate
# A copy of the Sprite_Character class, with some adjustments made.
# Used to create the duplicate event sprites.
#--------------------------------------------------------------------------
class Sprite_Duplicate < RPG::Sprite

attr_accessor :character # @character is the original event

def initialize(viewport, character = nil, x = 0, y = 0)
@x = x
@y = y
super(viewport)
@character = character
@z=@character.screen_z
update
end

def update
super
if @tile_id != @character.tile_id or
@character_name != @character.character_name or
@character_hue != @character.character_hue
@tile_id = @character.tile_id
@character_name = @character.character_name
@character_hue = @character.character_hue
if @tile_id >= 384
self.bitmap = RPG::Cache.tile($game_map.tileset_name, @tile_id, @character.character_hue)
self.src_rect.set(0, 0, 32, 32)
self.ox = 16
self.oy = 32
else
self.bitmap = RPG::Cache.character(@character.character_name, @character.character_hue)
@cw = bitmap.width / 4
@ch = bitmap.height / 4
self.ox = @cw / 2
self.oy = @ch
end
end
self.visible = (not @character.transparent)
if @tile_id == 0
sx = @character.pattern * @cw
sy = (@character.direction - 2) / 2 * @ch
self.src_rect.set(sx, sy, @cw, @ch)
end
# The coordinates of the duplicate event sprite. They are relative to the original event,
# so the duplicates will move and act as the original does; except the z coordinate,
# as when the original sprite would be of range, the duplicate would not appear.
self.x = @character.screen_x + @x
self.y = @character.screen_y + @y
self.z = @z
self.opacity = @character.opacity
self.blend_type = @character.blend_type
self.bush_depth = @character.bush_depth
if @character.animation_id != 0
animation = $data_animations[@character.animation_id]
animation(animation, true)
@character.animation_id = 0
end
end

end

#--------------------------------------------------------------------------
# ▼ CLASS Sprite_Character (edit)
# Used to create the duplicate sprites.
#--------------------------------------------------------------------------
class Sprite_Character < RPG::Sprite

alias wrap_original_sprite_character_initialize initialize
alias wrap_original_sprite_character_update update

def initialize(viewport, character = nil)
unless $game_temp.outside_array[$game_map.map_id]
wrap_original_sprite_character_initialize(viewport, character)
else
@character = character
super(viewport)
if $game_map.wrap == nil
$game_map.wrap = []
end
# 8 duplicates are created, stored in the $game_map.wrap array
if character.is_a?(Game_Event)
$game_map.wrap.push(Sprite_Duplicate.new(viewport, character, (-$game_map.width * 32), 0))
$game_map.wrap.push(Sprite_Duplicate.new(viewport, character, 0, (-$game_map.height * 32)))
$game_map.wrap.push(Sprite_Duplicate.new(viewport, character, ($game_map.width * 32), 0))
$game_map.wrap.push(Sprite_Duplicate.new(viewport, character, 0, ($game_map.height * 32)))
$game_map.wrap.push(Sprite_Duplicate.new(viewport, character, (-$game_map.width * 32), (-$game_map.height * 32)))
$game_map.wrap.push(Sprite_Duplicate.new(viewport, character, ($game_map.width * 32), ($game_map.height * 32)))
$game_map.wrap.push(Sprite_Duplicate.new(viewport, character, (-$game_map.width * 32), ($game_map.height * 32)))
$game_map.wrap.push(Sprite_Duplicate.new(viewport, character, ($game_map.width * 32), (-$game_map.height * 32)))
end
wrap_original_sprite_character_initialize(viewport, @character)
end
end

#------------------------------------------------------------------------
# ● Updates each sprite in the $game_map.wrap array
#------------------------------------------------------------------------
def update
unless $game_temp.outside_array[$game_map.map_id]
wrap_original_sprite_character_update
else
wrap_original_sprite_character_update
if $game_map.wrap != [] and character.is_a?(Game_Player)
for duplicate in $game_map.wrap
if duplicate != nil
duplicate.update
end
end
end
end
end

end

#--------------------------------------------------------------------------
# ▼ CLASS Spriteset_Map (edit)
# Prevents "disposed sprite" errors
#--------------------------------------------------------------------------

class Spriteset_Map

alias wrap_original_spriteset_map_initialize initialize

def initialize
$game_map.wrap=nil
wrap_original_spriteset_map_initialize
end

end

#--------------------------------------------------------------------------
# ▼ CLASS Scene_Save (edit)
# Prevent save errors
#--------------------------------------------------------------------------
class Scene_Save < Scene_File

alias wrap_original_scene_save_write_save_data write_save_data

def write_save_data(file)
$game_map.wrap = nil
wrap_original_scene_save_write_save_data(file)
end

end

#--------------------------------------------------------------------------
# ▼ CLASS Scene Map (edit)
# Initiates a loop for the methods of the Check_Coordinates class
#--------------------------------------------------------------------------
class Scene_Map

$coordinate_check = Check_Coordinates.new

alias wrap_original_scene_map_update update

def update
unless $game_temp.outside_array[$game_map.map_id]
wrap_original_scene_map_update
else
$coordinate_check.refresh_left
$coordinate_check.refresh_right
$coordinate_check.refresh_top
$coordinate_check.refresh_bottom
$coordinate_check.left_trigger
$coordinate_check.right_trigger
$coordinate_check.top_trigger
$coordinate_check.bottom_trigger
wrap_original_scene_map_update
end
end

end
 
Rispondi
#2
Fi-ata!
Solo (visto che sono mod):
1)Si chiama Wrap & drop, il termine tecnico dico...
2)L'unico modo per evitare di impedire al player di andare dall'altra parte è creare degli eventi invisibili ai confini della mappa per non far passare il player? Scusa non ho letto attentamente, ma se così fosse lo script perderebbe gran parte della sua utilità... certo resta il fatto che è utilissimo per creare un gioco di pacman... la pallina (il player) oltrepassa il confine a destra e si ritrova dall'altra parte, lontano dai mostri... quello si!Wink
 
Rispondi
#3
lo script fà che nelle mappe che contengono _wrap nel nome continuano all'infinito sempre con il tuo tileset
 
Rispondi
#4
Ho capito... diciamo... comunque non sono più mod xD
 
Rispondi
  


Vai al forum:


Browsing: 1 Ospite(i)