80 lines
1.9 KiB
GDScript
80 lines
1.9 KiB
GDScript
extends RigidBody2D
|
|
|
|
const MIN_SPEED = 50.0
|
|
const MAX_SPEED = 500.0
|
|
|
|
signal hit_brick(ball : Node, brick : Node)
|
|
signal hit_paddle(ball : Node)
|
|
signal hit_floor(ball : Node)
|
|
signal hit_wall(ball : Node)
|
|
|
|
var captured : bool = false
|
|
var capture_object : Node2D
|
|
var capture_offset : Vector2 = Vector2.ZERO
|
|
|
|
var speed : float = 100
|
|
|
|
func _physics_process(delta: float) -> void:
|
|
# angular_velocity = 0
|
|
rotation = 0
|
|
if captured:
|
|
PhysicsServer2D.body_set_state(
|
|
get_rid(),
|
|
PhysicsServer2D.BODY_STATE_TRANSFORM,
|
|
Transform2D.IDENTITY.translated(capture_object.global_position - capture_offset)
|
|
)
|
|
linear_velocity = Vector2.ZERO
|
|
angular_velocity = 0
|
|
else:
|
|
if linear_velocity.length() != speed:
|
|
linear_velocity = linear_velocity.normalized() * speed
|
|
|
|
|
|
|
|
|
|
func capture(ob : Node2D, offset : Vector2 = Vector2.ZERO) -> void:
|
|
captured = true
|
|
capture_object = ob
|
|
capture_offset = offset
|
|
|
|
func release() -> void:
|
|
global_position = capture_object.global_position - capture_offset
|
|
var diff = (global_position.x - capture_object.global_position.x) / (capture_object.width/2)
|
|
# linear_velocity = Vector2(diff, -1).normalized() * 100
|
|
apply_central_impulse(Vector2(diff, -1).normalized() * 1)
|
|
captured = false
|
|
capture_object = null
|
|
|
|
|
|
|
|
func _on_body_exited(body: Node) -> void:
|
|
if body is Brick:
|
|
if not body.visible:
|
|
return
|
|
$BrickSound.play()
|
|
body.hit()
|
|
hit_brick.emit(self, body)
|
|
speed += 1
|
|
return
|
|
if body is Paddle:
|
|
var diff = (position.x - body.position.x) / (body.width/2)
|
|
linear_velocity = (Vector2(diff, -1).normalized()) * speed
|
|
$PaddleSound.play()
|
|
body.hit()
|
|
hit_paddle.emit(self)
|
|
return
|
|
if body is Wall:
|
|
if abs(linear_velocity.y) < 0.01:
|
|
linear_velocity.y = randf() * 10.0
|
|
elif abs(linear_velocity.y) < 1:
|
|
linear_velocity.y *= 10.0
|
|
$WallSound.play()
|
|
hit_wall.emit(self)
|
|
return
|
|
if body is Floor:
|
|
hit_floor.emit(self)
|
|
return
|
|
|
|
func slowdown() -> void:
|
|
speed = 100
|