59 lines
1.7 KiB
GDScript
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)
|