- Pokémon Essentials Version
- v20.1 ➖
Simple script to get a little fancy with the camera!
Code
Ruby:
class ZoomMap
attr_accessor :goal
attr_accessor :speed
attr_accessor :zoom
def initialize(goal,speed,zoom="in")
@viewport = Viewport.new(0, 0, Graphics.width, Graphics.height)
@viewport.z = 99999
self.goal = goal
self.speed = speed
self.zoom = zoom.downcase
@sprites = {}
@sprites["map"] = Sprite.new(@viewport)
@sprites["map"].bitmap = Graphics.snap_to_bitmap
@sprites["map"].center_origins
@sprites["map"].x = Graphics.width/2
@sprites["map"].y = Graphics.height/2
Graphics.update
end
def update
if @sprites
@sprites["map"].bitmap.clear
messagewindow = $game_temp.message_window
cmdwindow = $game_temp.cmd_window
pausemenu = $game_temp.pause_menu_scene
messagewindow.visible = false if messagewindow
cmdwindow.visible = false if cmdwindow
pausemenu.pbHideMenu if pausemenu
@sprites["map"].bitmap = Graphics.snap_to_bitmap
@sprites["map"].center_origins
@sprites["map"].x = Graphics.width/2
@sprites["map"].y = Graphics.height/2
messagewindow.visible = true if messagewindow
cmdwindow.visible = true if cmdwindow
pausemenu.pbShowMenu if pausemenu
case self.zoom
when "in"
if @sprites["map"].zoom < self.goal
altspeed = self.goal - @sprites["map"].zoom
@sprites["map"].zoom+=[self.speed,altspeed].min
end
when "out"
if @sprites["map"].zoom > @goal
altspeed = @sprites["map"].zoom - self.goal
@sprites["map"].zoom-=[self.speed,altspeed].min
end
end
else
dispose
end
end
def dispose
pbDisposeSpriteHash(@sprites)
@viewport.dispose
end
end
def pbZoomMap(goal,speed,zoom="in")
if !$game_temp.background_zoom
$game_temp.background_zoom = ZoomMap.new(goal,speed,zoom)
else
$game_temp.background_zoom.goal = goal
$game_temp.background_zoom.speed = speed
$game_temp.background_zoom.zoom = zoom
end
end
def pbDisposeZoomMap
if $game_temp.background_zoom
$game_temp.background_zoom.dispose
$game_temp.background_zoom = nil
end
Graphics.update
end
EventHandlers.add(:on_frame_update,:map_zoom,
proc {
next if !$player
if $game_temp.background_zoom.is_a?(ZoomMap)
$game_temp.background_zoom.update
sprites = $game_temp.background_zoom.instance_variable_get(:@sprites)
if $game_temp.background_zoom.goal == 1 && sprites["map"].zoom == 1
pbDisposeZoomMap
end
end
}
)
#===============================================================================
#Pause Menu Rewriting
#===============================================================================
#If you're using an alternate pause UI,
#you should probably delete this whole section.
class Scene_Map
def call_menu
$game_temp.menu_calling = false
$game_temp.in_menu = true
$game_player.straighten
$game_map.update
$game_temp.pause_menu_scene = PokemonPauseMenu_Scene.new
$game_temp.pause_menu_screen = PokemonPauseMenu.new($game_temp.pause_menu_scene)
$game_temp.pause_menu_screen.pbStartPokemonMenu
$game_temp.in_menu = false
end
end
class PokemonPauseMenu_Scene
def pbShowMenu
@sprites["cmdwindow"].visible = true if @sprites["cmdwindow"]
@sprites["infowindow"].visible = @infostate if @sprites["infowindow"]
@sprites["helpwindow"].visible = @helpstate if @sprites["helpwindow"]
end
def pbHideMenu
@sprites["cmdwindow"].visible = false if @sprites["cmdwindow"]
@sprites["infowindow"].visible = false if @sprites["infowindow"]
@sprites["helpwindow"].visible = false if @sprites["helpwindow"]
end
end
#===============================================================================
#Sprite Utilities
#===============================================================================
#If you have these utilities defined elsewhere, you can delete this section.
class Sprite
#Utility from Marin
# Centers the sprite by setting the origin points to half the width and height
def center_origins
return if !self.bitmap
self.ox = self.bitmap.width / 2
self.oy = self.bitmap.height / 2
end
#Utility from Luka
#-----------------------------------------------------------------------------
# gets zoom
#-----------------------------------------------------------------------------
def zoom
return self.zoom_x
end
#-----------------------------------------------------------------------------
# sets all zoom values
#-----------------------------------------------------------------------------
def zoom=(val)
self.zoom_x = val
self.zoom_y = val
end
end
#===============================================================================
#Game Temp and Message Window rewriting
#===============================================================================
#This code is to allow the ZoomMap class to hide these windows
#when taking a screenshot, so that the text won't be zoomed in.
class Game_Temp
attr_accessor :background_zoom
attr_accessor :message_window
attr_accessor :cmd_window
attr_accessor :pause_menu_scene
attr_accessor :pause_menu_screen
end
def pbCreateMessageWindow(viewport=nil,skin=nil)
$game_temp.message_window = Window_AdvancedTextPokemon.new("")
msgwindow=$game_temp.message_window
if !viewport
msgwindow.z=99999
else
msgwindow.viewport=viewport
end
msgwindow.visible=true
msgwindow.letterbyletter=true
msgwindow.back_opacity=MessageConfig::WINDOW_OPACITY
pbBottomLeftLines(msgwindow,2)
$game_temp.message_window_showing=true if $game_temp
skin=MessageConfig.pbGetSpeechFrame() if !skin
msgwindow.setSkin(skin)
return msgwindow
end
def pbDisposeMessageWindow(msgwindow)
$game_temp.message_window_showing=false if $game_temp
$game_temp.message_window.dispose if $game_temp.message_window
msgwindow.dispose
end
def pbShowCommands(msgwindow,commands=nil,cmdIfCancel=0,defaultCmd=0)
return 0 if !commands
$game_temp.cmd_window = Window_CommandPokemonEx.new(commands)
cmdwindow = $game_temp.cmd_window
cmdwindow.z=99999
cmdwindow.visible=true
cmdwindow.resizeToFit(cmdwindow.commands)
pbPositionNearMsgWindow(cmdwindow,msgwindow,:right)
cmdwindow.index=defaultCmd
command=0
loop do
Graphics.update
Input.update
cmdwindow.update
msgwindow.update if msgwindow
yield if block_given?
if Input.trigger?(Input::BACK)
if cmdIfCancel>0
command=cmdIfCancel-1
break
elsif cmdIfCancel<0
command=cmdIfCancel
break
end
end
if Input.trigger?(Input::USE)
command=cmdwindow.index
break
end
pbUpdateSceneMap
end
ret=command
cmdwindow.dispose
Input.update
return ret
end
def pbShowCommandsWithHelp(msgwindow,commands,help,cmdIfCancel=0,defaultCmd=0)
msgwin=msgwindow
msgwin=pbCreateMessageWindow(nil) if !msgwindow
oldlbl=msgwin.letterbyletter
msgwin.letterbyletter=false
if commands
$game_temp.cmd_window = Window_CommandPokemonEx.new(commands)
cmdwindow = $game_temp.cmd_window
cmdwindow.z=99999
cmdwindow.visible=true
cmdwindow.resizeToFit(cmdwindow.commands)
cmdwindow.height=msgwin.y if cmdwindow.height>msgwin.y
cmdwindow.index=defaultCmd
command=0
msgwin.text=help[cmdwindow.index]
msgwin.width=msgwin.width # Necessary evil to make it use the proper margins
loop do
Graphics.update
Input.update
oldindex=cmdwindow.index
cmdwindow.update
if oldindex!=cmdwindow.index
msgwin.text=help[cmdwindow.index]
end
msgwin.update
yield if block_given?
if Input.trigger?(Input::BACK)
if cmdIfCancel>0
command=cmdIfCancel-1
break
elsif cmdIfCancel<0
command=cmdIfCancel
break
end
end
if Input.trigger?(Input::USE)
command=cmdwindow.index
break
end
pbUpdateSceneMap
end
ret=command
cmdwindow.dispose
Input.update
end
msgwin.letterbyletter=oldlbl
msgwin.dispose if !msgwindow
return ret
end
Ruby:
class ZoomMap
attr_accessor :goal
attr_accessor :speed
attr_accessor :zoom
def initialize(goal,speed,zoom="in")
@viewport = Viewport.new(0, 0, Graphics.width, Graphics.height)
@viewport.z = 99999
self.goal = goal
self.speed = speed
self.zoom = zoom.downcase
@sprites = {}
@sprites["map"] = Sprite.new(@viewport)
@sprites["map"].bitmap = Graphics.snap_to_bitmap
@sprites["map"].center_origins
@sprites["map"].x = Graphics.width/2
@sprites["map"].y = Graphics.height/2
Graphics.update
end
def update
if @sprites
@sprites["map"].bitmap.clear
messagewindow = $game_temp.message_window
cmdwindow = $game_temp.cmd_window
pausemenu = $game_temp.pause_menu_scene
messagewindow.visible = false if messagewindow
cmdwindow.visible = false if cmdwindow
pausemenu.pbHideMenu if pausemenu
@sprites["map"].bitmap = Graphics.snap_to_bitmap
@sprites["map"].center_origins
@sprites["map"].x = Graphics.width/2
@sprites["map"].y = Graphics.height/2
messagewindow.visible = true if messagewindow
cmdwindow.visible = true if cmdwindow
pausemenu.pbShowMenu if pausemenu
case self.zoom
when "in"
if @sprites["map"].zoom < self.goal
altspeed = self.goal - @sprites["map"].zoom
@sprites["map"].zoom+=[self.speed,altspeed].min
end
when "out"
if @sprites["map"].zoom > @goal
altspeed = @sprites["map"].zoom - self.goal
@sprites["map"].zoom-=[self.speed,altspeed].min
end
end
else
dispose
end
end
def dispose
pbDisposeSpriteHash(@sprites)
@viewport.dispose
end
end
def pbZoomMap(goal,speed,zoom="in")
if !$game_temp.background_zoom
$game_temp.background_zoom = ZoomMap.new(goal,speed,zoom)
else
$game_temp.background_zoom.goal = goal
$game_temp.background_zoom.speed = speed
$game_temp.background_zoom.zoom = zoom
end
end
def pbDisposeZoomMap
if $game_temp.background_zoom
$game_temp.background_zoom.dispose
$game_temp.background_zoom = nil
end
Graphics.update
end
Events.onMapUpdate += proc { |_sender,_e|
next if !$Trainer
if $game_temp.background_zoom.is_a?(ZoomMap)
$game_temp.background_zoom.update
sprites = $game_temp.background_zoom.instance_variable_get(:@sprites)
if $game_temp.background_zoom.goal == 1 && sprites["map"].zoom == 1
pbDisposeZoomMap
end
end
}
#===============================================================================
#Pause Menu Rewriting
#===============================================================================
#If you're using an alternate pause UI,
#you should probably delete this whole section.
class Scene_Map
def call_menu
$game_temp.menu_calling = false
$game_temp.in_menu = true
$game_player.straighten
$game_map.update
$game_temp.pause_menu_scene = PokemonPauseMenu_Scene.new
$game_temp.pause_menu_screen = PokemonPauseMenu.new($game_temp.pause_menu_scene)
$game_temp.pause_menu_screen.pbStartPokemonMenu
$game_temp.in_menu = false
end
end
class PokemonPauseMenu_Scene
def pbShowMenu
@sprites["cmdwindow"].visible = true if @sprites["cmdwindow"]
@sprites["infowindow"].visible = @infostate if @sprites["infowindow"]
@sprites["helpwindow"].visible = @helpstate if @sprites["helpwindow"]
end
def pbHideMenu
@sprites["cmdwindow"].visible = false if @sprites["cmdwindow"]
@sprites["infowindow"].visible = false if @sprites["infowindow"]
@sprites["helpwindow"].visible = false if @sprites["helpwindow"]
end
end
#===============================================================================
#Sprite Utilities
#===============================================================================
#If you have these utilities defined elsewhere, you can delete this section.
class Sprite
#Utility from Marin
# Centers the sprite by setting the origin points to half the width and height
def center_origins
return if !self.bitmap
self.ox = self.bitmap.width / 2
self.oy = self.bitmap.height / 2
end
#Utility from Luka
#-----------------------------------------------------------------------------
# gets zoom
#-----------------------------------------------------------------------------
def zoom
return self.zoom_x
end
#-----------------------------------------------------------------------------
# sets all zoom values
#-----------------------------------------------------------------------------
def zoom=(val)
self.zoom_x = val
self.zoom_y = val
end
end
#===============================================================================
#Game Temp and Message Window rewriting
#===============================================================================
#This code is to allow the ZoomMap class to hide these windows
#when taking a screenshot, so that the text won't be zoomed in.
class Game_Temp
attr_accessor :background_zoom
attr_accessor :message_window
attr_accessor :cmd_window
attr_accessor :pause_menu_scene
attr_accessor :pause_menu_screen
end
def pbCreateMessageWindow(viewport=nil,skin=nil)
$game_temp.message_window = Window_AdvancedTextPokemon.new("")
msgwindow=$game_temp.message_window
if !viewport
msgwindow.z=99999
else
msgwindow.viewport=viewport
end
msgwindow.visible=true
msgwindow.letterbyletter=true
msgwindow.back_opacity=MessageConfig::WINDOW_OPACITY
pbBottomLeftLines(msgwindow,2)
$game_temp.message_window_showing=true if $game_temp
skin=MessageConfig.pbGetSpeechFrame() if !skin
msgwindow.setSkin(skin)
return msgwindow
end
def pbDisposeMessageWindow(msgwindow)
$game_temp.message_window_showing=false if $game_temp
$game_temp.message_window.dispose if $game_temp.message_window
msgwindow.dispose
end
def pbShowCommands(msgwindow,commands=nil,cmdIfCancel=0,defaultCmd=0)
return 0 if !commands
$game_temp.cmd_window = Window_CommandPokemonEx.new(commands)
cmdwindow = $game_temp.cmd_window
cmdwindow.z=99999
cmdwindow.visible=true
cmdwindow.resizeToFit(cmdwindow.commands)
pbPositionNearMsgWindow(cmdwindow,msgwindow,:right)
cmdwindow.index=defaultCmd
command=0
loop do
Graphics.update
Input.update
cmdwindow.update
msgwindow.update if msgwindow
yield if block_given?
if Input.trigger?(Input::BACK)
if cmdIfCancel>0
command=cmdIfCancel-1
break
elsif cmdIfCancel<0
command=cmdIfCancel
break
end
end
if Input.trigger?(Input::USE)
command=cmdwindow.index
break
end
pbUpdateSceneMap
end
ret=command
cmdwindow.dispose
Input.update
return ret
end
def pbShowCommandsWithHelp(msgwindow,commands,help,cmdIfCancel=0,defaultCmd=0)
msgwin=msgwindow
msgwin=pbCreateMessageWindow(nil) if !msgwindow
oldlbl=msgwin.letterbyletter
msgwin.letterbyletter=false
if commands
$game_temp.cmd_window = Window_CommandPokemonEx.new(commands)
cmdwindow = $game_temp.cmd_window
cmdwindow.z=99999
cmdwindow.visible=true
cmdwindow.resizeToFit(cmdwindow.commands)
cmdwindow.height=msgwin.y if cmdwindow.height>msgwin.y
cmdwindow.index=defaultCmd
command=0
msgwin.text=help[cmdwindow.index]
msgwin.width=msgwin.width # Necessary evil to make it use the proper margins
loop do
Graphics.update
Input.update
oldindex=cmdwindow.index
cmdwindow.update
if oldindex!=cmdwindow.index
msgwin.text=help[cmdwindow.index]
end
msgwin.update
yield if block_given?
if Input.trigger?(Input::BACK)
if cmdIfCancel>0
command=cmdIfCancel-1
break
elsif cmdIfCancel<0
command=cmdIfCancel
break
end
end
if Input.trigger?(Input::USE)
command=cmdwindow.index
break
end
pbUpdateSceneMap
end
ret=command
cmdwindow.dispose
Input.update
end
msgwin.letterbyletter=oldlbl
msgwin.dispose if !msgwindow
return ret
end
Using this Script
You've just got the two calls here!
pbZoomMap(goal,speed,zoom="in")
Goal is the zoom level that you want to reach. Remember that a normal zoom is 1- think of it as "1 = 100%". A goal of 2 would have your map zoom in to 200%.
Speed is the amount that the zoom increases/decreases by per frame. If you're doing an amount less than 1, remember to put a 0 before the decimal- 0.5 instead of .5, for example.
Set zoom to "out" to zoom out. (speed should still be a positive number)
pbDisposeZoomMap
gets rid of the zoom. Note that it does so abruptly, without zooming out- it's mostly just there for cases like exiting a map, where the fade to black will keep it from being too jarring. If you to remove it while the player's still on the map, you should zoom back out to 1 through pbZoomMap.Please note that this is only for zooming in from standard view and zooming back out from a zoomed-in view- it currently cannot zoom out any further, and I don't think that's actually possible to do. (I'll look into it later, though.)
If you're using a pause menu with its own GUI- for example, bop's HGSS menu- you should delete the section that starts with "Pause Menu Rewriting" to avoid conflicts between the two.
Because the zoom is stored in $game_temp, it's deleted when the player closes the game. If you want a map to be zoomed when the player has control, you should probably have a parallel process or autoplay event, so that players who save on the map can reload their game without breaking the zoom.
Future Goals
- I... may need to fix the save window as well, I'll get that soon.
- I'm pretty sure zooming out is impossible, but I'll write it here in case I ever get around to the possibility.
- Credits
- Marin and Luka SJ for their script utilities
Golisopod User for the textbox fix
TechSkylander1518 for the rest of the code