mirror of
https://github.com/godotengine/godot-demo-projects.git
synced 2026-01-04 06:09:46 +03:00
Added new test for 2D character controller: Character - Pixels Functional test for pixel art related issues around KinematicBody and RigidBody character controllers. Adjusted existing tests and added more test cases to cover most use cases from recent fixed issues and regressions for KinematicBody. Added a more automated way to run all tests with checks to see which ones failed in character controller tests. Also fixed some minor issues with the log scrollbar.
148 lines
3.7 KiB
GDScript
148 lines
3.7 KiB
GDScript
extends TestCharacter
|
|
|
|
|
|
const OPTION_TEST_CASE_ALL = "Test Cases/TEST ALL (0)"
|
|
const OPTION_TEST_CASE_DETECT_FLOOR_NO_SNAP = "Test Cases/Floor detection (Kinematic Body)"
|
|
const OPTION_TEST_CASE_DETECT_FLOOR_MOTION_CHANGES = "Test Cases/Floor detection with motion changes (Kinematic Body)"
|
|
|
|
const MOTION_CHANGES_DIR = Vector2(1.0, 1.0)
|
|
const MOTION_CHANGES_SPEEDS = [0.5, 1.0, 2.0, 5.0, 10.0, 20.0, 50.0]
|
|
|
|
var _test_floor_detection = false
|
|
var _test_motion_changes = false
|
|
var _floor_detected = false
|
|
var _floor_lost = false
|
|
|
|
var _failed_reason = ""
|
|
|
|
|
|
func _ready():
|
|
options.add_menu_item(OPTION_TEST_CASE_ALL)
|
|
options.add_menu_item(OPTION_TEST_CASE_DETECT_FLOOR_NO_SNAP)
|
|
options.add_menu_item(OPTION_TEST_CASE_DETECT_FLOOR_MOTION_CHANGES)
|
|
|
|
func _physics_process(_delta):
|
|
if _moving_body:
|
|
if _moving_body.is_on_floor():
|
|
_floor_detected = true
|
|
elif _floor_detected:
|
|
_floor_lost = true
|
|
if _test_motion_changes:
|
|
Log.print_log("Floor lost.")
|
|
|
|
if _test_motion_changes:
|
|
var speed_count = MOTION_CHANGES_SPEEDS.size()
|
|
var speed_index = randi() % speed_count
|
|
var speed = MOTION_CHANGES_SPEEDS[speed_index]
|
|
var velocity = speed * MOTION_CHANGES_DIR
|
|
_moving_body._constant_velocity = velocity
|
|
#Log.print_log("Velocity: %s" % velocity)
|
|
|
|
|
|
func _input(event):
|
|
var key_event = event as InputEventKey
|
|
if key_event and not key_event.pressed:
|
|
if key_event.scancode == KEY_0:
|
|
_on_option_selected(OPTION_TEST_CASE_ALL)
|
|
|
|
|
|
func _on_option_selected(option):
|
|
match option:
|
|
OPTION_TEST_CASE_ALL:
|
|
_test_all()
|
|
OPTION_TEST_CASE_DETECT_FLOOR_NO_SNAP:
|
|
_start_test_case(option)
|
|
return
|
|
OPTION_TEST_CASE_DETECT_FLOOR_MOTION_CHANGES:
|
|
_start_test_case(option)
|
|
return
|
|
|
|
._on_option_selected(option)
|
|
|
|
|
|
func _start_test_case(option):
|
|
Log.print_log("* Starting " + option)
|
|
|
|
match option:
|
|
OPTION_TEST_CASE_DETECT_FLOOR_NO_SNAP:
|
|
_test_floor_detection = true
|
|
_test_motion_changes = false
|
|
_use_snap = false
|
|
_body_type = E_BodyType.KINEMATIC_BODY
|
|
_start_test()
|
|
|
|
yield(start_timer(1.0), "timeout")
|
|
if is_timer_canceled():
|
|
return
|
|
|
|
_set_result(not _floor_lost)
|
|
OPTION_TEST_CASE_DETECT_FLOOR_MOTION_CHANGES:
|
|
_test_floor_detection = true
|
|
_test_motion_changes = true
|
|
_use_snap = false
|
|
_body_type = E_BodyType.KINEMATIC_BODY
|
|
_start_test()
|
|
|
|
yield(start_timer(4.0), "timeout")
|
|
if is_timer_canceled():
|
|
_test_motion_changes = false
|
|
return
|
|
|
|
_test_motion_changes = false
|
|
_moving_body._constant_velocity = Vector2.ZERO
|
|
|
|
_set_result(not _floor_lost)
|
|
_:
|
|
Log.print_error("Invalid test case.")
|
|
|
|
|
|
func _test_all():
|
|
Log.print_log("* TESTING ALL...")
|
|
|
|
# Test floor detection with no snapping.
|
|
yield(_start_test_case(OPTION_TEST_CASE_DETECT_FLOOR_NO_SNAP), "completed")
|
|
|
|
# Test floor detection with no snapping.
|
|
# In this test case, motion alternates different speeds.
|
|
yield(_start_test_case(OPTION_TEST_CASE_DETECT_FLOOR_MOTION_CHANGES), "completed")
|
|
|
|
Log.print_log("* Done.")
|
|
|
|
|
|
func _set_result(test_passed):
|
|
var result = ""
|
|
if test_passed:
|
|
result = "PASSED"
|
|
else:
|
|
result = "FAILED"
|
|
|
|
if not test_passed and not _failed_reason.empty():
|
|
result += _failed_reason
|
|
else:
|
|
result += "."
|
|
|
|
Log.print_log("Test %s" % result)
|
|
|
|
|
|
func _start_test():
|
|
._start_test()
|
|
|
|
_failed_reason = ""
|
|
|
|
_floor_detected = false
|
|
_floor_lost = false
|
|
|
|
if _test_floor_detection:
|
|
_failed_reason = ": floor was not detected consistently."
|
|
if _test_motion_changes:
|
|
# Always use the same seed for reproducible results.
|
|
rand_seed(123456789)
|
|
_moving_body._gravity_force = 0.0
|
|
_moving_body._motion_speed = 0.0
|
|
_moving_body._jump_force = 0.0
|
|
else:
|
|
_moving_body._initial_velocity = Vector2(30, 0)
|
|
_test_floor_detection = false
|
|
else:
|
|
_test_motion_changes = false
|