Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #===============================================================
- # ● [VX] ◦ Smooth Scrolling ◦ □
- # * Nice scrolling effect like an action game~! *
- # * Ported from XP Version (by Toby Zerner) *
- #--------------------------------------------------------------
- # ◦ by Woratana [[email protected]]
- # ◦ 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
- class Game_Map
- #--------------------------------------------------------------------------
- # * Scroll Setup
- #--------------------------------------------------------------------------
- alias wora_smoscr_gammap_setscr setup_scroll unless $@
- 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
Advertisement
Add Comment
Please, Sign In to add comment