-
Notifications
You must be signed in to change notification settings - Fork 0
/
ball.gd
92 lines (61 loc) · 2.09 KB
/
ball.gd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
extends CharacterBody2D
class_name Ball
signal life_lost
const VELOCITY_LIMIT = 40
@export var ball_speed = 15
@export var lifes = 3
@export var death_zone: DeathZone
@export var ui: UI
var speed_up_factor = 1.05
var start_position: Vector2
var last_collider_id
@onready var collision_shape_2d = $CollisionShape2D
func _ready():
ui.set_lifes(lifes)
start_position = position
death_zone.life_lost.connect(on_life_lost)
func _physics_process(delta):
var collision = move_and_collide(velocity * ball_speed * delta)
if !collision:
return
var collider = collision.get_collider()
if collider is Brick:
collider.decrease_level()
if collider is Brick or collider is Paddle:
ball_collision(collider)
else:
velocity = velocity.bounce(collision.get_normal())
# Calculate rotation based on movement
var rotation_angle = velocity.angle()
rotation = rotation_angle
func start_ball():
position = start_position
randomize()
velocity = Vector2(randf_range(-1, 1), randf_range(-0.1, -1)).normalized() * ball_speed
func on_life_lost():
lifes -= 1
life_lost.emit()
ui.set_lifes(lifes)
if lifes == 0:
ui.game_over()
else:
reset_ball()
func reset_ball():
position = start_position
velocity = Vector2.ZERO
func ball_collision(collider):
var _ball_width = $CollisionShape2D.shape.get_rect().size.x
var ball_center_x = position.x
var collider_width = collider.get_width()
var collider_center_x = collider.position.x
var velocity_xy = velocity.length()
var collision_x = (ball_center_x - collider_center_x) / (collider_width / 2)
var new_velocity = Vector2.ZERO
new_velocity.x = velocity_xy * collision_x
if collider.get_rid() == last_collider_id && collider is Brick:
new_velocity.x = new_velocity.rotated(deg_to_rad(randf_range(-45, 45))).x * 10
else:
last_collider_id = collider.get_rid()
new_velocity.y = sqrt(absf(velocity_xy * velocity_xy - new_velocity.x * new_velocity.x)) * (-1 if velocity.y > 0 else 1)
var speed_multiplier = speed_up_factor if collider is Paddle else 1.0
velocity = (new_velocity * speed_multiplier).limit_length(VELOCITY_LIMIT)