####부드러운 화면 스크롤#########
#===============================================================
# ● [VX] ◦ Smooth Scrolling ◦ □
# * Nice scrolling effect like an action game~! *
# * Ported from XP Version (by Toby Zerner) *
#--------------------------------------------------------------
# ◦ by Woratana [woratana@hotmail.com]
# ◦ Thaiware RPG Maker Community
# ◦ Released on: 08/02/2009
# ◦ Version: 1.0
#--------------------------------------------------------------
# ◦ Compatibility:
#--------------------------------------------------------------
# □ This script will rewrite 6 method(s):
# Game_Map.start_scroll
# Game_Map.scroll_up
# Game_Map.scroll_down
# Game_Map.scroll_left
# Game_Map.scroll_right
# Game_Map.update_scroll
#
# □ This script will alias 1 method(s):
# Game_Map.setup_scroll
#
# □ This script would crash with other custom scripts that rewrite same method(s)
#
# □ This script may not work with maps that use loop.
#--------------------------------------------------------------
# ◦ Installation:
#--------------------------------------------------------------
# 1) This script should be placed JUST AFTER ▼ Materials.
#
# □ Like this:
# ▼ Materials
# * Smooth Scrolling
# ...
# ...
# ▼ Main Process
# Main
#
# 2) Setup this script in Setup Part below.
#
#--------------------------------------------------------------
# ◦ How to use:
#--------------------------------------------------------------
# □ Just place this script and try moving player in your game.
#
#=================================================================
# ● [VX] ◦ Smooth Scrolling ◦ □
# * Nice scrolling effect like an action game~! *
# * Ported from XP Version (by Toby Zerner) *
#--------------------------------------------------------------
# ◦ by Woratana [woratana@hotmail.com]
# ◦ Thaiware RPG Maker Community
# ◦ Released on: 08/02/2009
# ◦ Version: 1.0
#--------------------------------------------------------------
# ◦ Compatibility:
#--------------------------------------------------------------
# □ This script will rewrite 6 method(s):
# Game_Map.start_scroll
# Game_Map.scroll_up
# Game_Map.scroll_down
# Game_Map.scroll_left
# Game_Map.scroll_right
# Game_Map.update_scroll
#
# □ This script will alias 1 method(s):
# Game_Map.setup_scroll
#
# □ This script would crash with other custom scripts that rewrite same method(s)
#
# □ This script may not work with maps that use loop.
#--------------------------------------------------------------
# ◦ Installation:
#--------------------------------------------------------------
# 1) This script should be placed JUST AFTER ▼ Materials.
#
# □ Like this:
# ▼ Materials
# * Smooth Scrolling
# ...
# ...
# ▼ Main Process
# Main
#
# 2) Setup this script in Setup Part below.
#
#--------------------------------------------------------------
# ◦ How to use:
#--------------------------------------------------------------
# □ Just place this script and try moving player in your game.
#
#=================================================================
class Game_System
#=================================================================
# ++ Setup Part
#-----------------------------------------------------------------
DEFAULT_DECELERATION_START = 4 # (default: 4)
# How fast before it will start decelerating (Higher = Start Faster)
# You can change this value in game by call script:
# $game_system.decel_start = (value)
DEFAULT_DECELERATION_SPEED = 4 # (default: 4)
# How fast it will decelerate each frame (Higher = Decelerate Faster)
# You can change this value in game by call script:
# $game_system.decel_speed = (value)
#-----------------------------------------------------------------
def decel_start
@decel_start ||= DEFAULT_DECELERATION_START
return @decel_start
end
def decel_speed
@decel_speed ||= DEFAULT_DECELERATION_SPEED
return @decel_speed
end
def decel_start=(value)
@decel_start = value
end
def decel_speed=(value)
@decel_speed = value
end
end
#=================================================================
# ++ Setup Part
#-----------------------------------------------------------------
DEFAULT_DECELERATION_START = 4 # (default: 4)
# How fast before it will start decelerating (Higher = Start Faster)
# You can change this value in game by call script:
# $game_system.decel_start = (value)
DEFAULT_DECELERATION_SPEED = 4 # (default: 4)
# How fast it will decelerate each frame (Higher = Decelerate Faster)
# You can change this value in game by call script:
# $game_system.decel_speed = (value)
#-----------------------------------------------------------------
def decel_start
@decel_start ||= DEFAULT_DECELERATION_START
return @decel_start
end
def decel_speed
@decel_speed ||= DEFAULT_DECELERATION_SPEED
return @decel_speed
end
def decel_start=(value)
@decel_start = value
end
def decel_speed=(value)
@decel_speed = value
end
end
class Game_Map
#--------------------------------------------------------------------------
# * Scroll Setup
#--------------------------------------------------------------------------
alias wora_smoscr_gammap_setscr setup_scroll
def setup_scroll(*args)
wora_smoscr_gammap_setscr(*args)
# Initialize smooth scrolling variables
# scroll_remain: the number of pixels * 4 the still need to be scrolled
@scroll_remain_x = 0
@scroll_remain_y = 0
# scroll_take: the number of pixels * 4 that are being scrolled every frame
# i.e. scrolling speed
@scroll_take_x = 0
@scroll_take_y = 0
# scroll_decel: variables for calculating decelaration
@scroll_decel_x = 0
@scroll_decel_y = 0
end
#--------------------------------------------------------------------------
# * Start Scroll
#--------------------------------------------------------------------------
def start_scroll(direction, distance, speed)
# Set scrolling variables
distance = distance.ceil * 256
@scroll_direction = direction
@scroll_speed = speed
@scroll_rest = distance
# Execute scrolling
case @scroll_direction
when 2 # Down
scroll_down(@scroll_rest)
when 4 # Left
scroll_left(@scroll_rest)
when 6 # Right
scroll_right(@scroll_rest)
when 8 # Up
scroll_up(@scroll_rest)
end
end
#--------------------------------------------------------------------------
# * Scroll Down
#--------------------------------------------------------------------------
def scroll_down(distance)
# Ceil the distance
distance = distance.ceil
# If the map is scrolling from an event command, then use that scroll speed
if scrolling? then @scroll_take_y = 2 ** @scroll_speed
# If the map is not scrolling
else
# Make sure the distance is always divisible by 4
if distance.ceil % 4 == 0 then @scroll_take_y = distance.ceil
elsif distance.ceil % 4 <= 2 then @scroll_take_y = distance.ceil - distance.ceil % 4
else @scroll_take_y = distance.ceil + (4 - (distance.ceil % 4)) end
end
# If scrolling coordinates are inside the map's boundaries
unless @display_y + @scroll_remain_y + distance > (self.height - 13) * 256
# Add onto the amount left to be scrolled
@scroll_remain_y += distance
end
end
#--------------------------------------------------------------------------
# * Scroll Left
#--------------------------------------------------------------------------
def scroll_left(distance)
# Ceil the distance
distance = distance.ceil
# If the map is scrolling from an event command, then use that scroll speed
if scrolling? then @scroll_take_x = 2 ** @scroll_speed
# If the map is not scrolling
else
# Make sure the distance is always divisible by 4
if distance.ceil % 4 == 0 then @scroll_take_x = distance.ceil
elsif distance.ceil % 4 <= 2 then @scroll_take_x = distance.ceil - distance.ceil % 4
else @scroll_take_x = distance.ceil + (4 - (distance.ceil % 4)) end
end
# If scrolling coordinates are inside the map's boundaries
unless @display_x - @scroll_remain_x - distance < 0
# Add onto the amount left to be scrolled
@scroll_remain_x -= distance
end
end
#--------------------------------------------------------------------------
# * Scroll Right
#--------------------------------------------------------------------------
def scroll_right(distance)
# Ceil the distance
distance = distance.ceil
# If the map is scrolling from an event command, then use that scroll speed
if scrolling? then @scroll_take_x = 2 ** @scroll_speed
# If the map is not scrolling
else
# Make sure the distance is always divisible by 4
if distance.ceil % 4 == 0 then @scroll_take_x = distance.ceil
elsif distance.ceil % 4 <= 2 then @scroll_take_x = distance.ceil - distance.ceil % 4
else @scroll_take_x = distance.ceil + (4 - (distance.ceil % 4)) end
end
# If scrolling coordinates are inside the map's boundaries
unless @display_x + @scroll_remain_x + distance > (self.width - 17) * 256
# Add onto the amount left to be scrolled
@scroll_remain_x += distance
end
end
#--------------------------------------------------------------------------
# * Scroll Up
#--------------------------------------------------------------------------
def scroll_up(distance)
# Ceil the distance
distance = distance.ceil
# If the map is scrolling from an event command, then use that scroll speed
if scrolling? then @scroll_take_y = 2 ** @scroll_speed
# If the map is not scrolling
else
# Make sure the distance is always divisible by 4
if distance.ceil % 4 == 0 then @scroll_take_y = distance.ceil
elsif distance.ceil % 4 <= 2 then @scroll_take_y = distance.ceil - distance.ceil % 4
else @scroll_take_y = distance.ceil + (4 - (distance.ceil % 4)) end
end
# If scrolling coordinates are inside the map's boundaries
unless @display_y - @scroll_remain_y - distance < 0
# Add onto the amount left to be scrolled
@scroll_remain_y -= distance
end
end
#--------------------------------------------------------------------------
# * Update Scroll
#--------------------------------------------------------------------------
def update_scroll
# If the map is still scrolling
if @scroll_rest > 0 then @scroll_rest -= 2 ** @scroll_speed end
# If the x axis needs to be scrolled to the right
if @scroll_remain_x > 0
# If the amount to be scrolled is close enough to 0 to decelerate
if @scroll_remain_x <= @scroll_take_x * $game_system.decel_start
old_display_x = @display_x
# Add onto the deceleration variable
@scroll_decel_x += $game_system.decel_speed
# Work out how much to scroll
distance = [@scroll_take_x - @scroll_decel_x, 4].max
# If the scrolling coordinates are within the map's boundaries
unless @display_x + distance > (self.width - 17) * 256
@display_x += distance
@parallax_x += distance
end
# Subtract the amount that was scrolled
@scroll_remain_x += old_display_x - @display_x
if @scroll_remain_x < 0 then @scroll_remain_x = 0 end
# Otherwise, scroll at a normal speed
else
# Reset the deceleration variable
@scroll_decel_x = 0
# If the scrolling coordinates are out of range
if @display_x + @scroll_take_x > (self.width - 17) * 256
@display_x = (self.width - 20) * 256
@scroll_remain_x = 0
# Otherwise, scroll normally
else
@display_x += @scroll_take_x
@parallax_x += @scroll_take_x
@scroll_remain_x -= @scroll_take_x
end
end
# If the x axis needs to be scrolled to the left
elsif @scroll_remain_x < 0
# If the amount to be scrolled is close enough to 0 to decelerate
if @scroll_remain_x >= -@scroll_take_x * $game_system.decel_start
old_display_x = @display_x
# Add onto the deceleration variable
@scroll_decel_x += $game_system.decel_speed
# Work out how much to scroll
distance = [@scroll_take_x - @scroll_decel_x, 4].max
# If the scrolling coordinates are within the map's boundaries
unless @display_x - distance < 0
@display_x -= distance
@parallax_x -= distance
end
# Subtract the amount that was scrolled
@scroll_remain_x += old_display_x - @display_x
if @scroll_remain_x > 0 then @scroll_remain_x = 0 end
# Otherwise, scroll at a normal speed
else
# Reset the deceleration variable
@scroll_decel_x = 0
# If the scrolling coordinates are out of range
if @display_x - @scroll_take_x < 0
@display_x = 0
@scroll_remain_x = 0
# Otherwise, scroll normally
else
@display_x -= @scroll_take_x
@parallax_x -= @scroll_take_x
@scroll_remain_x += @scroll_take_x
end
end
# If no x scrolling needs to be done, reset the deceleration variable
else @scroll_decel_x = 0 end
# If the y axis needs to be scrolled downwards
if @scroll_remain_y > 0
# If the amount to be scrolled is close enough to 0 to decelerate
if @scroll_remain_y <= @scroll_take_y * $game_system.decel_start
old_display_y = @display_y
# Add onto the deceleration variable
@scroll_decel_y += $game_system.decel_speed
# Work out how much to scroll
distance = [@scroll_take_y - @scroll_decel_y, 4].max
# If the scrolling coordinates are within the map's boundaries
unless @display_y + distance > (self.height - 13) * 256
@display_y += distance
@parallax_y += distance
end
# Subtract the amount that was scrolled
@scroll_remain_y += old_display_y - @display_y
if @scroll_remain_y < 0 then @scroll_remain_y = 0 end
# Otherwise, scroll at a normal speed
else
# Reset the deceleration variable
@scroll_speed_accel_y = 0
# If the scrolling coordinates are out of range
if @display_y + @scroll_take_y > (self.height - 13) * 256
@display_y = (self.height - 15) * 256
@scroll_remain_y = 0
# Otherwise, scroll normally
else
@display_y += @scroll_take_y
@parallax_y += @scroll_take_y
@scroll_remain_y -= @scroll_take_y
end
end
# If the y axis needs to be scrolled upwards
elsif @scroll_remain_y < 0
# If the amount to be scrolled is close enough to 0 to decelerate
if @scroll_remain_y >= -@scroll_take_y * $game_system.decel_start
old_display_y = @display_y
# Add onto the deceleration variable
@scroll_decel_y += $game_system.decel_speed
# Work out how much to scroll
distance = [@scroll_take_y - @scroll_decel_y, 4].max
# If the scrolling coordinates are within the map's boundaries
unless @display_y - distance < 0
@display_y -= distance
@parallax_y -= distance
end
# Subtract the amount that was scrolled
@scroll_remain_y += old_display_y - @display_y
if @scroll_remain_y > 0 then @scroll_remain_y = 0 end
# Otherwise, scroll at a normal speed
else
# Reset the deceleration variable
@scroll_speed_accel_y = 0
# If the scrolling coordinates are out of range
if @display_y - @scroll_take_y < 0
@display_y = 0
@scroll_remain_y = 0
# Otherwise, scroll normally
else
@display_y -= @scroll_take_y
@parallax_y -= @scroll_take_y
@scroll_remain_y += @scroll_take_y
end
end
# If no y scrolling needs to be done, reset the deceleration variable
else
@scroll_decel_y = 0
end
end
end
#--------------------------------------------------------------------------
# * Scroll Setup
#--------------------------------------------------------------------------
alias wora_smoscr_gammap_setscr setup_scroll
def setup_scroll(*args)
wora_smoscr_gammap_setscr(*args)
# Initialize smooth scrolling variables
# scroll_remain: the number of pixels * 4 the still need to be scrolled
@scroll_remain_x = 0
@scroll_remain_y = 0
# scroll_take: the number of pixels * 4 that are being scrolled every frame
# i.e. scrolling speed
@scroll_take_x = 0
@scroll_take_y = 0
# scroll_decel: variables for calculating decelaration
@scroll_decel_x = 0
@scroll_decel_y = 0
end
#--------------------------------------------------------------------------
# * Start Scroll
#--------------------------------------------------------------------------
def start_scroll(direction, distance, speed)
# Set scrolling variables
distance = distance.ceil * 256
@scroll_direction = direction
@scroll_speed = speed
@scroll_rest = distance
# Execute scrolling
case @scroll_direction
when 2 # Down
scroll_down(@scroll_rest)
when 4 # Left
scroll_left(@scroll_rest)
when 6 # Right
scroll_right(@scroll_rest)
when 8 # Up
scroll_up(@scroll_rest)
end
end
#--------------------------------------------------------------------------
# * Scroll Down
#--------------------------------------------------------------------------
def scroll_down(distance)
# Ceil the distance
distance = distance.ceil
# If the map is scrolling from an event command, then use that scroll speed
if scrolling? then @scroll_take_y = 2 ** @scroll_speed
# If the map is not scrolling
else
# Make sure the distance is always divisible by 4
if distance.ceil % 4 == 0 then @scroll_take_y = distance.ceil
elsif distance.ceil % 4 <= 2 then @scroll_take_y = distance.ceil - distance.ceil % 4
else @scroll_take_y = distance.ceil + (4 - (distance.ceil % 4)) end
end
# If scrolling coordinates are inside the map's boundaries
unless @display_y + @scroll_remain_y + distance > (self.height - 13) * 256
# Add onto the amount left to be scrolled
@scroll_remain_y += distance
end
end
#--------------------------------------------------------------------------
# * Scroll Left
#--------------------------------------------------------------------------
def scroll_left(distance)
# Ceil the distance
distance = distance.ceil
# If the map is scrolling from an event command, then use that scroll speed
if scrolling? then @scroll_take_x = 2 ** @scroll_speed
# If the map is not scrolling
else
# Make sure the distance is always divisible by 4
if distance.ceil % 4 == 0 then @scroll_take_x = distance.ceil
elsif distance.ceil % 4 <= 2 then @scroll_take_x = distance.ceil - distance.ceil % 4
else @scroll_take_x = distance.ceil + (4 - (distance.ceil % 4)) end
end
# If scrolling coordinates are inside the map's boundaries
unless @display_x - @scroll_remain_x - distance < 0
# Add onto the amount left to be scrolled
@scroll_remain_x -= distance
end
end
#--------------------------------------------------------------------------
# * Scroll Right
#--------------------------------------------------------------------------
def scroll_right(distance)
# Ceil the distance
distance = distance.ceil
# If the map is scrolling from an event command, then use that scroll speed
if scrolling? then @scroll_take_x = 2 ** @scroll_speed
# If the map is not scrolling
else
# Make sure the distance is always divisible by 4
if distance.ceil % 4 == 0 then @scroll_take_x = distance.ceil
elsif distance.ceil % 4 <= 2 then @scroll_take_x = distance.ceil - distance.ceil % 4
else @scroll_take_x = distance.ceil + (4 - (distance.ceil % 4)) end
end
# If scrolling coordinates are inside the map's boundaries
unless @display_x + @scroll_remain_x + distance > (self.width - 17) * 256
# Add onto the amount left to be scrolled
@scroll_remain_x += distance
end
end
#--------------------------------------------------------------------------
# * Scroll Up
#--------------------------------------------------------------------------
def scroll_up(distance)
# Ceil the distance
distance = distance.ceil
# If the map is scrolling from an event command, then use that scroll speed
if scrolling? then @scroll_take_y = 2 ** @scroll_speed
# If the map is not scrolling
else
# Make sure the distance is always divisible by 4
if distance.ceil % 4 == 0 then @scroll_take_y = distance.ceil
elsif distance.ceil % 4 <= 2 then @scroll_take_y = distance.ceil - distance.ceil % 4
else @scroll_take_y = distance.ceil + (4 - (distance.ceil % 4)) end
end
# If scrolling coordinates are inside the map's boundaries
unless @display_y - @scroll_remain_y - distance < 0
# Add onto the amount left to be scrolled
@scroll_remain_y -= distance
end
end
#--------------------------------------------------------------------------
# * Update Scroll
#--------------------------------------------------------------------------
def update_scroll
# If the map is still scrolling
if @scroll_rest > 0 then @scroll_rest -= 2 ** @scroll_speed end
# If the x axis needs to be scrolled to the right
if @scroll_remain_x > 0
# If the amount to be scrolled is close enough to 0 to decelerate
if @scroll_remain_x <= @scroll_take_x * $game_system.decel_start
old_display_x = @display_x
# Add onto the deceleration variable
@scroll_decel_x += $game_system.decel_speed
# Work out how much to scroll
distance = [@scroll_take_x - @scroll_decel_x, 4].max
# If the scrolling coordinates are within the map's boundaries
unless @display_x + distance > (self.width - 17) * 256
@display_x += distance
@parallax_x += distance
end
# Subtract the amount that was scrolled
@scroll_remain_x += old_display_x - @display_x
if @scroll_remain_x < 0 then @scroll_remain_x = 0 end
# Otherwise, scroll at a normal speed
else
# Reset the deceleration variable
@scroll_decel_x = 0
# If the scrolling coordinates are out of range
if @display_x + @scroll_take_x > (self.width - 17) * 256
@display_x = (self.width - 20) * 256
@scroll_remain_x = 0
# Otherwise, scroll normally
else
@display_x += @scroll_take_x
@parallax_x += @scroll_take_x
@scroll_remain_x -= @scroll_take_x
end
end
# If the x axis needs to be scrolled to the left
elsif @scroll_remain_x < 0
# If the amount to be scrolled is close enough to 0 to decelerate
if @scroll_remain_x >= -@scroll_take_x * $game_system.decel_start
old_display_x = @display_x
# Add onto the deceleration variable
@scroll_decel_x += $game_system.decel_speed
# Work out how much to scroll
distance = [@scroll_take_x - @scroll_decel_x, 4].max
# If the scrolling coordinates are within the map's boundaries
unless @display_x - distance < 0
@display_x -= distance
@parallax_x -= distance
end
# Subtract the amount that was scrolled
@scroll_remain_x += old_display_x - @display_x
if @scroll_remain_x > 0 then @scroll_remain_x = 0 end
# Otherwise, scroll at a normal speed
else
# Reset the deceleration variable
@scroll_decel_x = 0
# If the scrolling coordinates are out of range
if @display_x - @scroll_take_x < 0
@display_x = 0
@scroll_remain_x = 0
# Otherwise, scroll normally
else
@display_x -= @scroll_take_x
@parallax_x -= @scroll_take_x
@scroll_remain_x += @scroll_take_x
end
end
# If no x scrolling needs to be done, reset the deceleration variable
else @scroll_decel_x = 0 end
# If the y axis needs to be scrolled downwards
if @scroll_remain_y > 0
# If the amount to be scrolled is close enough to 0 to decelerate
if @scroll_remain_y <= @scroll_take_y * $game_system.decel_start
old_display_y = @display_y
# Add onto the deceleration variable
@scroll_decel_y += $game_system.decel_speed
# Work out how much to scroll
distance = [@scroll_take_y - @scroll_decel_y, 4].max
# If the scrolling coordinates are within the map's boundaries
unless @display_y + distance > (self.height - 13) * 256
@display_y += distance
@parallax_y += distance
end
# Subtract the amount that was scrolled
@scroll_remain_y += old_display_y - @display_y
if @scroll_remain_y < 0 then @scroll_remain_y = 0 end
# Otherwise, scroll at a normal speed
else
# Reset the deceleration variable
@scroll_speed_accel_y = 0
# If the scrolling coordinates are out of range
if @display_y + @scroll_take_y > (self.height - 13) * 256
@display_y = (self.height - 15) * 256
@scroll_remain_y = 0
# Otherwise, scroll normally
else
@display_y += @scroll_take_y
@parallax_y += @scroll_take_y
@scroll_remain_y -= @scroll_take_y
end
end
# If the y axis needs to be scrolled upwards
elsif @scroll_remain_y < 0
# If the amount to be scrolled is close enough to 0 to decelerate
if @scroll_remain_y >= -@scroll_take_y * $game_system.decel_start
old_display_y = @display_y
# Add onto the deceleration variable
@scroll_decel_y += $game_system.decel_speed
# Work out how much to scroll
distance = [@scroll_take_y - @scroll_decel_y, 4].max
# If the scrolling coordinates are within the map's boundaries
unless @display_y - distance < 0
@display_y -= distance
@parallax_y -= distance
end
# Subtract the amount that was scrolled
@scroll_remain_y += old_display_y - @display_y
if @scroll_remain_y > 0 then @scroll_remain_y = 0 end
# Otherwise, scroll at a normal speed
else
# Reset the deceleration variable
@scroll_speed_accel_y = 0
# If the scrolling coordinates are out of range
if @display_y - @scroll_take_y < 0
@display_y = 0
@scroll_remain_y = 0
# Otherwise, scroll normally
else
@display_y -= @scroll_take_y
@parallax_y -= @scroll_take_y
@scroll_remain_y += @scroll_take_y
end
end
# If no y scrolling needs to be done, reset the deceleration variable
else
@scroll_decel_y = 0
end
end
end