#==============================================================================
# 粘性移动平台
# by ???nOBodY???
#==============================================================================
# 设置一个粘性平台,首先你需要一个事件
# 在事件的移动路线里使用脚本:
# self.accessible = true 或 self.accessible = false
# 来开启或关闭事件的粘性状态.
#
# 粘性事件移动时会带着玩家一起移动,直至玩家离开事件
# 平台事件的事件页里,并行处理以下内容:
#
# 如果: 脚本: get_character(0).accessible
# 脚本: get_character(0).through = false
# 如果: 脚本: get_character(0).x == $game_player.x &&
# get_character(0).y == $game_player.y
# 脚本: $game_player.platformID = @event_id
# 结束
# 否则
# Script: get_character(0).through = true
# 结束
#==============================================================================
class Game_CharacterBase
#--------------------------------------------------------------------------
# * Public Instance Variables
#--------------------------------------------------------------------------
attr_accessor :through # pass-through
attr_accessor :accessible # able to be boarded
#--------------------------------------------------------------------------
# * Object Initialization
#--------------------------------------------------------------------------
alias movingPlatformsChar_initializer initialize
def initialize
movingPlatformsChar_initializer
@accessible = false
end
#--------------------------------------------------------------------------
# ● 通行可能判定
# d : 方向(2,4,6,8)
#--------------------------------------------------------------------------
def passableEx?(x, y, d)
x2 = $game_map.round_x_with_direction(x, d)
y2 = $game_map.round_y_with_direction(y, d)
return false unless $game_map.valid?(x2, y2)
return true if @through || debug_through?
#PATCH
if !$game_map.events_xy(x2, y2).empty?
for event in $game_map.events_xy(x2, y2)
return true if event.accessible
end
end
if !$game_map.events_xy(x, y).empty?
#no need to check current location
else
return false unless map_passable?(x, y, d)
end
#return false unless map_passable?(x, y, d)
#PATCH
return false unless map_passable?(x2, y2, reverse_dir(d))
return false if collide_with_characters?(x2, y2)
return true
end
#--------------------------------------------------------------------------
# ● まっすぐに移動
# d : 方向(2,4,6,8)
# turn_ok : その場での向き変更を許可
#--------------------------------------------------------------------------
def move_straight(d, turn_ok = true)
@move_succeed = passableEx?(@x, @y, d)
if @move_succeed
set_direction(d)
@x = $game_map.round_x_with_direction(@x, d)
@y = $game_map.round_y_with_direction(@y, d)
@real_x = $game_map.x_with_direction(@x, reverse_dir(d))
@real_y = $game_map.y_with_direction(@y, reverse_dir(d))
increase_steps
elsif turn_ok
set_direction(d)
check_event_trigger_touch_front
end
end
end
#==============================================================================
# ** Game_Player
#------------------------------------------------------------------------------
# This class handles maps. It includes event starting determinants and map
# scrolling functions. The instance of this class is referenced by $game_map.
#==============================================================================
class Game_Player < Game_Character
#--------------------------------------------------------------------------
# * Get Character
# param : if -1, player. If 0, this event. Otherwise, event ID.
#--------------------------------------------------------------------------
def get_character(param)
case param
when -1 # Player
return $game_player #self?
when 0 # This event
events = $game_map.events
return events == nil ? nil : events[@event_id]
else # Particular event
events = $game_map.events
return events == nil ? nil : events[param]
end
end
#--------------------------------------------------------------------------
# * Public Instance Variables
#--------------------------------------------------------------------------
attr_accessor :platformID # if greater than 0, an event ID
#--------------------------------------------------------------------------
# * Object Initialization
#--------------------------------------------------------------------------
alias movingPlatformsPlyr_initializer initialize
def initialize
movingPlatformsPlyr_initializer
@platformID = 0
@exitingPlatform = false
@fixingPosition = false
end
#--------------------------------------------------------------------------
# * Frame Update
#--------------------------------------------------------------------------
alias movingPlatforms_updater update
def update
if @platformID > 0
last_real_x = @real_x
last_real_y = @real_y
@x = get_character(@platformID).x
@y = get_character(@platformID).y
#Get realMoveSpeed & distancePerFrame
realMoveSpeed = get_character(@platformID).move_speed + 1#(dash? ? 1 : 0)
distancePerFrame = 2 ** realMoveSpeed / 256.0
temp = @real_x != get_character(@platformID).real_x ||
@real_y != get_character(@platformID).real_y ? true : false
if temp && !@fixingPosition
# Fixing position check
@fixingPosition=false
if @real_x != get_character(@platformID).real_x
if @real_x < get_character(@platformID).real_x
if get_character(@platformID).real_x <= @real_x + distancePerFrame
@fixingPosition=true
end
end
if @real_x > get_character(@platformID).real_x
if get_character(@platformID).real_x >= @real_x - distancePerFrame
@fixingPosition=true
end
end
end
if @real_y != get_character(@platformID).real_y
if @real_y < get_character(@platformID).real_y
if get_character(@platformID).real_y <= @real_y + distancePerFrame
@fixingPosition=true
end
end
if @real_y > get_character(@platformID).real_y
if get_character(@platformID).real_y >= @real_y - distancePerFrame
@fixingPosition=true
end
end
end
# Convert to movement
@real_x = [@real_x - distancePerFrame, @x].max if @x < @real_x
@real_x = [@real_x + distancePerFrame, @x].min if @x > @real_x
@real_y = [@real_y - distancePerFrame, @y].max if @y < @real_y
@real_y = [@real_y + distancePerFrame, @y].min if @y > @real_y
update_bush_depth unless moving?
update_animation
else
@real_x = get_character(@platformID).real_x
@real_y = get_character(@platformID).real_y
end
move_by_input_onPlatform
if @exitingPlatform
movingPlatforms_updater
@platformID = 0
@exitingPlatform = false
@fixingPosition = false
end
update_scroll(last_real_x, last_real_y)
else
movingPlatforms_updater
end
end
#--------------------------------------------------------------------------
# * Processing of Movement via input from the Directional Buttons
#--------------------------------------------------------------------------
def move_by_input_onPlatform
return unless get_character(@platformID).accessible
return if !movable? || $game_map.interpreter.running?
case Input.dir4
when 2
move_straight(Input.dir4) if Input.dir4 > 0
@exitingPlatform = @move_succeed ? true : false
when 4
move_straight(Input.dir4) if Input.dir4 > 0
@exitingPlatform = @move_succeed ? true : false
when 6
move_straight(Input.dir4) if Input.dir4 > 0
@exitingPlatform = @move_succeed ? true : false
when 8
move_straight(Input.dir4) if Input.dir4 > 0
@exitingPlatform = @move_succeed ? true : false
end
end
end