215 lines
7.9 KiB
GDScript
215 lines
7.9 KiB
GDScript
class_name MovementParameters
|
|
extends Reference
|
|
|
|
# Allow floats from -10 to 20 and snap the value to multiples of 0.2.
|
|
|
|
export(PoolVector2Array) var _speed_start = PoolVector2Array([Vector2(0,0),Vector2(0,0),Vector2(0,0)])
|
|
export(PoolVector2Array) var _speed_end = PoolVector2Array([Vector2(0,0),Vector2(0,0),Vector2(0,0)])
|
|
|
|
## MP accelleration is reflective of minimum maximum and adjusted accel
|
|
## It can be accessed directly now, doesn't need the direction
|
|
export(Vector2) var _acceleration = Vector2(0,0)
|
|
const BASE_ACCELERATION = 0
|
|
const MAX_ACCELERATION = 1
|
|
const MIN_ACCELERATION = 2 # or -1
|
|
|
|
## Vector based ones for x and y
|
|
#export var base_move_speed :Vector2
|
|
#export var base_move_acceleration :Vector2
|
|
#export var move_speed_modifier :Vector2
|
|
#export var move_speed_modifier_acceleration :Vector2
|
|
export var jerk_factor :Vector2
|
|
|
|
var gravity: int = ProjectSettings.get_setting("physics/2d/default_gravity")
|
|
#var jerk: float = 0.0
|
|
|
|
## Can be set to help with debugging the velocity controller
|
|
export var debug_name :String
|
|
|
|
# export var base_h_move_speed :float
|
|
# export var base_h_move_acceleration :float
|
|
# export var h_move_speed_modifier :float
|
|
# export var h_move_modifier_move_acceleration :float
|
|
|
|
# export var base_v_move_speed :float
|
|
# export var base_v_move_acceleration :float
|
|
# export var v_move_speed_modifier :float
|
|
# export var v_move_modifier_move_acceleration :float
|
|
|
|
func get_speed_start(direction :int) -> Vector2:
|
|
return _speed_start[direction]
|
|
|
|
func set_speed_start(direction :int, value :Vector2) -> void:
|
|
_speed_start[direction] = value
|
|
|
|
func get_speed_end(direction :int) -> Vector2:
|
|
return _speed_end[direction]
|
|
|
|
func set_speed_end(direction :int, value :Vector2) -> void:
|
|
_speed_end[direction] = value
|
|
|
|
func get_acceleration() -> Vector2:
|
|
return _acceleration
|
|
|
|
## Sort of the conditional clamp of acceleration parameters
|
|
func set_acceleration(value :Vector2, min_value :Vector2, max_value :Vector2) -> void:
|
|
var adjusted_accel = value
|
|
if adjusted_accel.x < min_value.x:
|
|
adjusted_accel.x = min_value.x
|
|
if adjusted_accel.y < min_value.y:
|
|
adjusted_accel.y = min_value.y
|
|
|
|
if max_value.x != 0:
|
|
if adjusted_accel.x > max_value.x:
|
|
adjusted_accel.x = max_value.x
|
|
if max_value.y != 0:
|
|
if adjusted_accel.y > max_value.y:
|
|
adjusted_accel.y = max_value.y
|
|
|
|
_acceleration = adjusted_accel
|
|
|
|
|
|
func modify(_movement_parameters :MovementParameters):
|
|
pass
|
|
|
|
func apply_multiple_modifiers( _modifiers: Array, _movement_direction :Vector2):
|
|
for m in _modifiers:
|
|
if m is StateModifierMovement:
|
|
##TODO: Check sign of direction here or maybe further down?
|
|
# if m.direction != sign(_movement_direction):
|
|
# pass
|
|
apply_state_modifier(m, _movement_direction)
|
|
|
|
func apply_state_modifier(_modifier :StateModifierMovement, _movement_direction :Vector2):
|
|
#_modifier.direction == _modifier.APPLIED_DIRECTIONS.LEFT_OR_UP
|
|
## Accel processing is the same regardless of direction now
|
|
set_acceleration( ( _acceleration + _modifier.acceleration),
|
|
_modifier.min_acceleration,
|
|
_modifier.max_acceleration )
|
|
# var adjusted_accel = acceleration[BASE_ACCELERATION] + _modifier.acceleration
|
|
# if adjusted_accel.x < _modifier.min_acceleration.x:
|
|
# adjusted_accel.x = _modifier.min_acceleration.x
|
|
# if adjusted_accel.y < _modifier.min_acceleration.y:
|
|
# adjusted_accel.y = _modifier.min_acceleration.y
|
|
#
|
|
# if adjusted_accel.max_acceleration.x != 0:
|
|
# if adjusted_accel.x > _modifier.max_acceleration.x:
|
|
# adjusted_accel.x = _modifier.max_acceleration.x
|
|
# if adjusted_accel.max_acceleration.y != 0:
|
|
# if adjusted_accel.y > _modifier.max_acceleration.y:
|
|
# adjusted_accel.y = _modifier.max_acceleration.y
|
|
|
|
|
|
match _modifier.modifier_type:
|
|
StateModifierMovement.SUB_TYPE.NEGATIVE_CONSTRAINT:
|
|
# var adjusted_move_speed = base_move_speed.x + _modifier.horizontal_speed
|
|
# ## We crossed the zero from the base
|
|
# if sign(adjusted_move_speed) != sign(base_move_speed.x):
|
|
# base_move_speed.x = 0.0
|
|
# else:
|
|
# base_move_speed.x = adjusted_move_speed
|
|
|
|
var speed :Vector2 = get_speed_start(_modifier.direction)
|
|
var adjusted_move_speed = get_speed_start(_modifier.direction) + _modifier.speed_start
|
|
if sign(adjusted_move_speed.x) != sign(speed.x):
|
|
speed.x = 0.0
|
|
else:
|
|
speed.x = adjusted_move_speed.x
|
|
if sign(adjusted_move_speed.y) != sign(speed.y):
|
|
speed.y = 0.0
|
|
else:
|
|
speed.y = adjusted_move_speed.y
|
|
set_speed_start(_modifier.direction, speed)
|
|
|
|
speed = get_speed_end(_modifier.direction)
|
|
adjusted_move_speed = get_speed_end(_modifier.direction) + _modifier.speed_end
|
|
if sign(adjusted_move_speed.x) != sign(speed.x):
|
|
speed.x = 0.0
|
|
else:
|
|
speed.x = adjusted_move_speed.x
|
|
if sign(adjusted_move_speed.y) != sign(speed.y):
|
|
speed.y = 0.0
|
|
else:
|
|
speed.y = adjusted_move_speed.y
|
|
set_speed_end(_modifier.direction, speed)
|
|
|
|
|
|
# var adjusted_accel = base_move_acceleration.x + _modifier.horizontal_acceleration
|
|
# if sign(adjusted_accel) != sign(base_move_acceleration.x):
|
|
# base_move_acceleration.x = 0.0
|
|
# else:
|
|
# base_move_acceleration.x = adjusted_accel
|
|
|
|
#var accel :Vector2 = get_acceleration(_modifier.direction)
|
|
#var adjusted_accel = get_acceleration(_modifier.direction) + _modifier.acceleration
|
|
|
|
# if sign(adjusted_accel.x) != sign(accel.x):
|
|
# accel.x = 0.0
|
|
# else:
|
|
# accel.x = adjusted_accel.x
|
|
# if sign(adjusted_accel.y) != sign(accel.y):
|
|
# accel.y = 0.0
|
|
# else:
|
|
# accel.y = adjusted_accel.y
|
|
# set_acceleration(_modifier.direction, accel)
|
|
|
|
if (true): #DEGUG
|
|
var foo = 2+2
|
|
|
|
##TODO: Um, modifiers are a little weirder for this
|
|
#move_speed_modifier.x += _modifier.horizontal_speed_offset
|
|
# var speed_differance = base_move_speed.x + (move_speed_modifier.x + _modifier.horizontal_speed_offset)
|
|
# if sign(speed_differance) != sign(base_move_speed.x) and base_move_speed.x != 0:
|
|
# ## Add the inverse of the modifier instead
|
|
# move_speed_modifier.x += speed_differance * - 1
|
|
# else:
|
|
# move_speed_modifier.x += _modifier.horizontal_speed_offset
|
|
#
|
|
# move_speed_modifier_acceleration.x += _modifier.horizontal_speed_offset_acceleration
|
|
# move_speed_modifier.y += _modifier.vertical_speed_offset
|
|
# move_speed_modifier_acceleration.y += _modifier.vertical_speed_offset_acceleration
|
|
_:
|
|
# base_move_speed.x += _modifier.horizontal_speed
|
|
# base_move_acceleration.x += _modifier.horizontal_acceleration
|
|
# move_speed_modifier.x += _modifier.horizontal_speed_offset
|
|
# move_speed_modifier_acceleration.x += _modifier.horizontal_speed_offset_acceleration
|
|
#
|
|
# base_move_speed.y += _modifier.vertical_speed
|
|
# base_move_acceleration.y += _modifier.vertical_acceleration
|
|
# move_speed_modifier.y += _modifier.vertical_speed_offset
|
|
# move_speed_modifier_acceleration.y += _modifier.vertical_speed_offset_acceleration
|
|
|
|
set_speed_start(
|
|
_modifier.direction,
|
|
(get_speed_start(_modifier.direction) + _modifier.speed_start)
|
|
)
|
|
set_speed_end(
|
|
_modifier.direction,
|
|
(get_speed_end(_modifier.direction) + _modifier.speed_end)
|
|
)
|
|
# set_acceleration(
|
|
# _modifier.direction,
|
|
# (get_acceleration(_modifier.direction) + _modifier.acceleration)
|
|
# )
|
|
|
|
if (true): #DEGUG
|
|
var foo = 2+2
|
|
|
|
# UiManager.debug_text = ( #"H_Speed x Dir: " + str(h_speed) + str('duh') +
|
|
# "BaseSpeed Fm:{0} To:{1}".format({"0":"%5.2f" % base_move_speed.x, "1":"%5.2f" % base_move_speed.y}) +
|
|
# "\nSpeedMod Fm:{0} To:{1}".format({"0":"%5.2f" % move_speed_modifier.x, "1":"%5.2f" % move_speed_modifier.y}) +
|
|
# "\nMoveAccel: {0}, {1}".format({"0":"%4.1f" % base_move_acceleration.x, "1":"%4.1f" % base_move_acceleration.y}) +
|
|
# "\nType: " + str(_modifier.modifier_type)
|
|
# )
|
|
|
|
|
|
|
|
# var movement_params :Dictionary = {
|
|
# "_base_h_move_speed" : _state.horizontal_speed,
|
|
# "_base_h_move_acceleration" : _state.horizontal_acceleration,
|
|
# "_base_h_move_speed_modifier" : _state.horizontal_speed_offset,
|
|
# "_base_h_move_modifier_move_acceleration" : _state.horizontal_speed_offset_acceleration,
|
|
# "_jerk_factor" : _state.jerk_factor,
|
|
# "_gravity" : _state.gravity
|
|
# }
|