Includes platform steering via calibrated accel axes, ball physics, calibration overlay with axis detection, and runtime tuning sliders. Co-authored-by: Cursor <cursoragent@cursor.com>
82 lines
2.0 KiB
GDScript
82 lines
2.0 KiB
GDScript
extends Node2D
|
|
|
|
const RADIUS := 10.0
|
|
const SPEED := 420.0
|
|
const PLATFORM_HALF := Vector2(80.0, 12.0)
|
|
|
|
var velocity := Vector2.ZERO
|
|
|
|
|
|
func _ready() -> void:
|
|
velocity = Vector2(320.0, -360.0).normalized() * SPEED
|
|
|
|
|
|
func reset_to(center: Vector2) -> void:
|
|
position = center
|
|
var dir := Vector2(randf_range(-0.6, 0.6), -1.0).normalized()
|
|
velocity = dir * SPEED
|
|
queue_redraw()
|
|
|
|
|
|
func step(delta: float, platform_pos: Vector2, platform_vx: float, bounds: Rect2) -> void:
|
|
position += velocity * delta
|
|
_bounce_walls(bounds)
|
|
_bounce_platform_top(platform_pos, platform_vx)
|
|
queue_redraw()
|
|
|
|
|
|
func _bounce_walls(bounds: Rect2) -> void:
|
|
var min_x := bounds.position.x + RADIUS
|
|
var max_x := bounds.end.x - RADIUS
|
|
var min_y := bounds.position.y + RADIUS
|
|
var max_y := bounds.end.y - RADIUS
|
|
|
|
if position.x < min_x:
|
|
position.x = min_x
|
|
velocity.x = absf(velocity.x)
|
|
elif position.x > max_x:
|
|
position.x = max_x
|
|
velocity.x = -absf(velocity.x)
|
|
|
|
if position.y < min_y:
|
|
position.y = min_y
|
|
velocity.y = absf(velocity.y)
|
|
elif position.y > max_y:
|
|
position.y = max_y
|
|
velocity.y = -absf(velocity.y)
|
|
|
|
_normalize_speed()
|
|
|
|
|
|
func _bounce_platform_top(platform_pos: Vector2, platform_vx: float) -> void:
|
|
var left := platform_pos.x - PLATFORM_HALF.x
|
|
var right := platform_pos.x + PLATFORM_HALF.x
|
|
var top := platform_pos.y - PLATFORM_HALF.y
|
|
var bottom := platform_pos.y + PLATFORM_HALF.y
|
|
|
|
if position.x < left - RADIUS or position.x > right + RADIUS:
|
|
return
|
|
if velocity.y <= 0.0:
|
|
return
|
|
if position.y + RADIUS < top:
|
|
return
|
|
if position.y - RADIUS > bottom + 4.0:
|
|
return
|
|
|
|
position.y = top - RADIUS
|
|
velocity.y = -absf(velocity.y)
|
|
velocity.x += platform_vx * 0.45
|
|
_normalize_speed()
|
|
|
|
|
|
func _normalize_speed() -> void:
|
|
if velocity.length_squared() < 1.0:
|
|
velocity = Vector2.RIGHT * SPEED
|
|
else:
|
|
velocity = velocity.normalized() * SPEED
|
|
|
|
|
|
func _draw() -> void:
|
|
draw_circle(Vector2.ZERO, RADIUS, Color(1.0, 0.88, 0.35))
|
|
draw_arc(Vector2.ZERO, RADIUS, 0.0, TAU, 24, Color(1.0, 0.95, 0.7), 1.5)
|