pong_gdscript/ball.gd

59 lines
1.7 KiB
GDScript

extends RigidBody2D
signal game_over(winning_player: int)
@onready var label_position: Label = %LabelPosition
@onready var player_1: CharacterBody2D = %Player1
@onready var player_2: CharacterBody2D = %Player2
var speed := 400.0
var direction: Vector2
var window_size: Vector2
var player_1_shape: RectangleShape2D
var player_2_shape: RectangleShape2D
var winning_player: int
func _ready() -> void:
window_size = get_viewport().get_visible_rect().size
player_1_shape = player_1.get_node("CollisionShape2D").shape as RectangleShape2D
player_2_shape = player_2.get_node("CollisionShape2D").shape as RectangleShape2D
reset()
func reset() -> void:
position = Vector2(window_size.x / 2 - 5, window_size.y / 2 - 5)
speed = 400.0
direction = Vector2.ZERO
func serve() -> void:
direction = Vector2(randf_range(-1, 1), randf_range(-1, 1)).normalized()
func _physics_process(delta: float) -> void:
position += direction * speed * delta
label_position.text = str(position)
var ball_rect := Rect2(position - Vector2(10, 10), Vector2(20, 20))
var player_1_rect := Rect2(player_1.position - player_1_shape.extents, player_1_shape.extents * 2)
var player_2_rect := Rect2(player_2.position - player_2_shape.extents, player_2_shape.extents * 2)
if ball_rect.intersects(player_1_rect):
direction.x *= -1
elif ball_rect.intersects(player_2_rect):
direction.x *= -1
if position.y < 0:
position.y = 0
direction.y *= -1
speed *= 1.03
elif position.y > window_size.y:
position.y = window_size.y
direction.y *= -1
speed *= 1.03
if position.x < 0:
winning_player = 2
reset()
game_over.emit(winning_player)
elif position.x > window_size.x:
winning_player = 1
reset()
game_over.emit(winning_player)