Files
godot-demo-projects/2d/physics_tests/tests/functional/test_character.gd
2022-03-27 19:06:05 -05:00

216 lines
7.0 KiB
GDScript

extends Test
class_name TestCharacter
enum E_BodyType {
CHARACTER_BODY,
CHARACTER_BODY_RAY,
RIGID_BODY,
RIGID_BODY_RAY,
}
const OPTION_OBJECT_TYPE_CHARACTER = "Object type/Character body (1)"
const OPTION_OBJECT_TYPE_CHARACTER_RAY = "Object type/Character body with ray (2)"
const OPTION_OBJECT_TYPE_RIGID_BODY = "Object type/Rigid body (3)"
const OPTION_OBJECT_TYPE_RIGID_BODY_RAY = "Object type/Rigid body with ray (4)"
const OPTION_MOVE_CHARACTER_SNAP = "Move Options/Use snap (Character only)"
const OPTION_MOVE_CHARACTER_STOP_ON_SLOPE = "Move Options/Use stop on slope (Character only)"
const OPTION_MOVE_CHARACTER_FLOOR_ONLY = "Move Options/Move on floor only (Character only)"
const OPTION_MOVE_CHARACTER_CONSTANT_SPEED = "Move Options/Use constant speed (Character only)"
@export var _initial_velocity = Vector2.ZERO
@export var _constant_velocity = Vector2.ZERO
@export var _motion_speed = 400.0
@export var _gravity_force = 50.0
@export var _jump_force = 1000.0
@export var _snap_distance = 0.0
@export var _floor_max_angle = 45.0
@export var _body_type : E_BodyType = 0
@onready var options = $Options
var _use_snap = true
var _use_stop_on_slope = true
var _use_floor_only = true
var _use_constant_speed = false
var _body_parent : Node = null
var _character_body_template = null
var _character_body_ray_template = null
var _rigid_body_template = null
var _rigid_body_ray_template = null
var _moving_body : PhysicsBody2D = null
func _ready():
options.connect(&"option_selected", Callable(self, "_on_option_selected"))
options.connect(&"option_changed", Callable(self, "_on_option_changed"))
_character_body_template = find_node("CharacterBody2D")
if _character_body_template:
_body_parent = _character_body_template.get_parent()
_body_parent.remove_child(_character_body_template)
var enabled = _body_type == E_BodyType.CHARACTER_BODY
options.add_menu_item(OPTION_OBJECT_TYPE_CHARACTER, true, enabled, true)
_character_body_ray_template = find_node("CharacterBodyRay2D")
if _character_body_ray_template:
_body_parent = _character_body_ray_template.get_parent()
_body_parent.remove_child(_character_body_ray_template)
var enabled = _body_type == E_BodyType.CHARACTER_BODY_RAY
options.add_menu_item(OPTION_OBJECT_TYPE_CHARACTER_RAY, true, enabled, true)
_rigid_body_template = find_node("RigidDynamicBody2D")
if _rigid_body_template:
_body_parent = _rigid_body_template.get_parent()
_body_parent.remove_child(_rigid_body_template)
var enabled = _body_type == E_BodyType.RIGID_BODY
options.add_menu_item(OPTION_OBJECT_TYPE_RIGID_BODY, true, enabled, true)
_rigid_body_ray_template = find_node("RigidBodyRay2D")
if _rigid_body_ray_template:
_body_parent = _rigid_body_ray_template.get_parent()
_body_parent.remove_child(_rigid_body_ray_template)
var enabled = _body_type == E_BodyType.RIGID_BODY_RAY
options.add_menu_item(OPTION_OBJECT_TYPE_RIGID_BODY_RAY, true, enabled, true)
options.add_menu_item(OPTION_MOVE_CHARACTER_SNAP, true, _use_snap)
options.add_menu_item(OPTION_MOVE_CHARACTER_STOP_ON_SLOPE, true, _use_stop_on_slope)
options.add_menu_item(OPTION_MOVE_CHARACTER_FLOOR_ONLY, true, _use_floor_only)
options.add_menu_item(OPTION_MOVE_CHARACTER_CONSTANT_SPEED, true, _use_constant_speed)
var floor_slider = find_node("FloorMaxAngle")
if floor_slider:
floor_slider.get_node("HSlider").value = _floor_max_angle
_start_test()
func _process(_delta):
var label_floor = $LabelFloor
if _moving_body:
if _moving_body.is_on_floor():
label_floor.text = "ON FLOOR"
label_floor.self_modulate = Color.GREEN
else:
label_floor.text = "OFF FLOOR"
label_floor.self_modulate = Color.RED
else:
label_floor.visible = false
func _input(event):
var key_event = event as InputEventKey
if key_event and not key_event.pressed:
if key_event.keycode == KEY_1:
if _character_body_template:
_on_option_selected(OPTION_OBJECT_TYPE_CHARACTER)
elif key_event.keycode == KEY_2:
if _character_body_ray_template:
_on_option_selected(OPTION_OBJECT_TYPE_CHARACTER_RAY)
elif key_event.keycode == KEY_3:
if _rigid_body_template:
_on_option_selected(OPTION_OBJECT_TYPE_RIGID_BODY)
elif key_event.keycode == KEY_4:
if _rigid_body_ray_template:
_on_option_selected(OPTION_OBJECT_TYPE_RIGID_BODY_RAY)
func _exit_tree():
if _character_body_template:
_character_body_template.free()
if _character_body_ray_template:
_character_body_ray_template.free()
if _rigid_body_template:
_rigid_body_template.free()
if _rigid_body_ray_template:
_rigid_body_ray_template.free()
func _on_option_selected(option):
match option:
OPTION_OBJECT_TYPE_CHARACTER:
_body_type = E_BodyType.CHARACTER_BODY
_start_test()
OPTION_OBJECT_TYPE_CHARACTER_RAY:
_body_type = E_BodyType.CHARACTER_BODY_RAY
_start_test()
OPTION_OBJECT_TYPE_RIGID_BODY:
_body_type = E_BodyType.RIGID_BODY
_start_test()
OPTION_OBJECT_TYPE_RIGID_BODY_RAY:
_body_type = E_BodyType.RIGID_BODY_RAY
_start_test()
func _on_option_changed(option, checked):
match option:
OPTION_MOVE_CHARACTER_SNAP:
_use_snap = checked
if _moving_body and _moving_body is CharacterBody2D:
_moving_body._snap = _snap_distance if _use_snap else 0.0
OPTION_MOVE_CHARACTER_STOP_ON_SLOPE:
_use_stop_on_slope = checked
if _moving_body and _moving_body is CharacterBody2D:
_moving_body._stop_on_slope = _use_stop_on_slope
OPTION_MOVE_CHARACTER_FLOOR_ONLY:
_use_floor_only = checked
if _moving_body and _moving_body is CharacterBody2D:
_moving_body._move_on_floor_only = _use_floor_only
OPTION_MOVE_CHARACTER_CONSTANT_SPEED:
_use_constant_speed = checked
if _moving_body and _moving_body is CharacterBody2D:
_moving_body._constant_speed = _use_constant_speed
func _update_floor_max_angle(value):
if (value == _floor_max_angle):
return
_floor_max_angle = value
if _moving_body and _moving_body is CharacterBody2D:
_moving_body._floor_max_angle = _floor_max_angle
func _start_test():
cancel_timer()
if _moving_body:
_body_parent.remove_child(_moving_body)
_moving_body.queue_free()
_moving_body = null
var test_label = "Testing: "
var template = null
match _body_type:
E_BodyType.CHARACTER_BODY:
template = _character_body_template
E_BodyType.CHARACTER_BODY_RAY:
template = _character_body_ray_template
E_BodyType.RIGID_BODY:
template = _rigid_body_template
E_BodyType.RIGID_BODY_RAY:
template = _rigid_body_ray_template
test_label += String(template.name)
_moving_body = template.duplicate()
_body_parent.add_child(_moving_body)
_moving_body._initial_velocity = _initial_velocity
_moving_body._constant_velocity = _constant_velocity
_moving_body._motion_speed = _motion_speed
_moving_body._gravity_force = _gravity_force
_moving_body._jump_force = _jump_force
_moving_body._floor_max_angle = _floor_max_angle
if _moving_body is CharacterBody2D:
_moving_body._snap = _snap_distance if _use_snap else 0.0
_moving_body._stop_on_slope = _use_stop_on_slope
_moving_body._move_on_floor_only = _use_floor_only
_moving_body._constant_speed = _use_constant_speed
$LabelTestType.text = test_label