Smooth map edge scrolling
This commit is contained in:
@@ -86,9 +86,71 @@ func _check_edge_scroll_layout_contract(failures: Array[String]) -> void:
|
||||
var first_cell_screen := scene._rect_for_cell(Vector2i(0, 0)).position + Vector2(4.0, 4.0)
|
||||
if scene._cell_from_screen(first_cell_screen) != Vector2i(0, 0):
|
||||
failures.append("screen-to-cell mapping should stay stable after scrolling")
|
||||
_check_edge_scroll_velocity_curve(scene, view_rect, failures)
|
||||
scene.free()
|
||||
|
||||
|
||||
func _check_edge_scroll_velocity_curve(scene, view_rect: Rect2, failures: Array[String]) -> void:
|
||||
for method_name in [
|
||||
"_edge_scroll_velocity_for_position",
|
||||
"_capped_edge_scroll_velocity",
|
||||
"_edge_scroll_axis_velocity",
|
||||
"_edge_scroll_pressure",
|
||||
"_edge_scroll_speed_for_pressure",
|
||||
"_edge_scroll_next_offset"
|
||||
]:
|
||||
if not scene.has_method(method_name):
|
||||
failures.append("missing edge-scroll helper: %s" % method_name)
|
||||
|
||||
var center_velocity: Vector2 = scene._edge_scroll_velocity_for_position(view_rect.get_center(), view_rect)
|
||||
if center_velocity != Vector2.ZERO:
|
||||
failures.append("edge scroll should be idle away from map edges: %s" % str(center_velocity))
|
||||
|
||||
var near_right: Vector2 = scene._edge_scroll_velocity_for_position(Vector2(view_rect.end.x - 36.0, view_rect.get_center().y), view_rect)
|
||||
var hard_right: Vector2 = scene._edge_scroll_velocity_for_position(Vector2(view_rect.end.x - 2.0, view_rect.get_center().y), view_rect)
|
||||
if near_right.x >= 0.0 or hard_right.x >= 0.0:
|
||||
failures.append("right-edge scroll should move the board left: near=%s hard=%s" % [str(near_right), str(hard_right)])
|
||||
if absf(hard_right.x) <= absf(near_right.x):
|
||||
failures.append("edge scroll should accelerate as the mouse reaches the outer edge")
|
||||
|
||||
var near_left: Vector2 = scene._edge_scroll_velocity_for_position(Vector2(view_rect.position.x + 36.0, view_rect.get_center().y), view_rect)
|
||||
var hard_left: Vector2 = scene._edge_scroll_velocity_for_position(Vector2(view_rect.position.x + 2.0, view_rect.get_center().y), view_rect)
|
||||
if near_left.x <= 0.0 or hard_left.x <= 0.0:
|
||||
failures.append("left-edge scroll should move the board right: near=%s hard=%s" % [str(near_left), str(hard_left)])
|
||||
if hard_left.x <= near_left.x:
|
||||
failures.append("left-edge scroll should accelerate as the mouse reaches the outer edge")
|
||||
|
||||
var top_left: Vector2 = scene._edge_scroll_velocity_for_position(view_rect.position + Vector2(2.0, 2.0), view_rect)
|
||||
if top_left.x <= 0.0 or top_left.y <= 0.0:
|
||||
failures.append("corner edge scroll should support diagonal movement: %s" % str(top_left))
|
||||
var max_edge_speed := float(scene._edge_scroll_speed_for_pressure(1.0))
|
||||
if top_left.length() > max_edge_speed + 0.01:
|
||||
failures.append("corner edge scroll should cap diagonal speed: %.2f > %.2f" % [top_left.length(), max_edge_speed])
|
||||
|
||||
var outside_velocity: Vector2 = scene._edge_scroll_velocity_for_position(view_rect.position - Vector2(4.0, 4.0), view_rect)
|
||||
if outside_velocity != Vector2.ZERO:
|
||||
failures.append("edge scroll should ignore mouse positions outside the map view: %s" % str(outside_velocity))
|
||||
|
||||
var hard_right_position := Vector2(view_rect.end.x - 2.0, view_rect.get_center().y)
|
||||
var moved_right: Vector2 = scene._edge_scroll_next_offset(Vector2.ZERO, hard_right_position, view_rect, 0.25)
|
||||
if moved_right.x >= 0.0:
|
||||
failures.append("edge scroll next offset should apply delta movement toward the right edge: %s" % str(moved_right))
|
||||
|
||||
var hard_left_position := Vector2(view_rect.position.x + 2.0, view_rect.get_center().y)
|
||||
var min_offset: Vector2 = scene._clamped_board_scroll_offset(Vector2(-9999.0, -9999.0))
|
||||
var moved_left: Vector2 = scene._edge_scroll_next_offset(min_offset, hard_left_position, view_rect, 0.25)
|
||||
if moved_left.x <= min_offset.x:
|
||||
failures.append("edge scroll next offset should recover from the left clamp toward the map origin: %s -> %s" % [str(min_offset), str(moved_left)])
|
||||
|
||||
var clamped_at_origin: Vector2 = scene._edge_scroll_next_offset(Vector2.ZERO, hard_left_position, view_rect, 0.25)
|
||||
if clamped_at_origin != Vector2.ZERO:
|
||||
failures.append("edge scroll next offset should not exceed the origin clamp: %s" % str(clamped_at_origin))
|
||||
|
||||
var clamped_at_far_edge: Vector2 = scene._edge_scroll_next_offset(min_offset, hard_right_position, view_rect, 0.25)
|
||||
if clamped_at_far_edge.x < min_offset.x - 0.01:
|
||||
failures.append("edge scroll next offset should not exceed the far clamp: %s below %s" % [str(clamped_at_far_edge), str(min_offset)])
|
||||
|
||||
|
||||
func _check_readability_contract(failures: Array[String]) -> void:
|
||||
var scene = BattleSceneScript.new()
|
||||
scene._create_hud()
|
||||
|
||||
Reference in New Issue
Block a user