Initial commit: Godot Pong game with WebSocket accelerometer control.
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>
This commit is contained in:
@@ -0,0 +1,81 @@
|
||||
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)
|
||||
Reference in New Issue
Block a user