Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- extends CharacterBody2D
- enum {PADDLE_LAYER=(1<<0), BRICK_LAYER=(1<<2)}
- const MIN_BOUNCE_ANGLE = deg_to_rad(20)
- @export var SPEED := 250
- var current_speed := SPEED
- var last_velocity = null
- func _ready() -> void:
- stop()
- func stop() -> void:
- set_physics_process(false)
- func _physics_process(delta: float) -> void:
- if velocity != last_velocity:
- last_velocity = velocity
- var collision = move_and_collide(velocity * delta)
- if collision:
- __handle_collision(collision)
- func __handle_collision(collision: KinematicCollision2D):
- var normal = collision.get_normal()
- velocity = velocity.bounce(normal).normalized() * current_speed
- var collider = collision.get_collider()
- if collider.collision_layer & PADDLE_LAYER:
- current_speed += 4
- if collider.ball_hit_sidways() and velocity.y > 0:
- velocity.y = -velocity.y
- if collider.collision_layer & BRICK_LAYER:
- collider.shater()
- func __bounce_with_minimum_angle(collision: KinematicCollision2D) -> Vector2:
- var normal = collision.get_normal()
- var bounced_velocity = velocity.bounce(normal).normalized()
- var angle = abs(bounced_velocity.angle_to(normal))
- if angle < MIN_BOUNCE_ANGLE:
- var sign = signf(bounced_velocity.cross(normal))
- bounced_velocity = normal.rotated(sign * -MIN_BOUNCE_ANGLE).normalized()
- return bounced_velocity
- func start() -> void:
- current_speed = SPEED
- var angle_deg = randf_range(50, 120.0)
- var angle_rad = deg_to_rad(angle_deg)
- velocity = Vector2.RIGHT.rotated(angle_rad) * current_speed
- set_physics_process(true)
Advertisement
Add Comment
Please, Sign In to add comment