Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Dúvida] Como colidir um objeto com a borda usando Python

Olá pessoal! Eu estou tentando recriar o jogo ''Pong'' pelo Python usando a biblioteca Pygame, porém logo de inicio eu já me deparei com um problema, eu quero fazer com que a bolinha do jogo fique colidindo com as bordas e seja ricocheteada... Já estou horas quebrando a cabeça com isso e nada da certo, se puderem me dar uma luz, eu agradeço desde já!

Por enquanto o código está assim:

import pygame
from sys import exit

pygame.init()

#Dimensões
x = 600
y = 400

#Tela
tela = pygame.display.set_mode((x, y))
relogio = pygame.time.Clock()

#Titulo na janela
pygame.display.set_caption('Pong')

#Bolinha
bolinha_X = 300
bolinha_Y = 200
diametro = 10
velocidade = 8

while True:
    tela.fill((0, 0, 0))
    pygame.time.Clock.tick(relogio, 30)

    for event in pygame.event.get():
        #Fecha a janela
        if event.type == pygame.QUIT:
            pygame.quit()
            exit()

    bolinha = pygame.draw.circle(tela, (255, 255, 255), (bolinha_X, bolinha_Y), diametro)

    if bolinha_X >= tela.get_width() or bolinha_X < 0:
        bolinha_X -= velocidade
    else:
        bolinha_X += velocidade


    pygame.display.update()
2 respostas
solução!

Olá Dev!

Você está no caminho certo, acredito que você pode seguir alguns passos .Primeiro, você precisa ajustar a lógica de movimento da bolinha. Atualmente, você está apenas subtraindo a velocidade quando a bolinha atinge as bordas direita ou esquerda, o que faz com que ela se mova na direção oposta. No entanto, para que a bolinha ricocheteie, você deve inverter a direção da velocidade quando ela atingir as bordas.

Aqui está como você pode fazer isso:

import pygame
from sys import exit

pygame.init()

# Dimensões
x = 600
y = 400

# Tela
tela = pygame.display.set_mode((x, y))
relogio = pygame.time.Clock()

# Titulo na janela
pygame.display.set_caption('Pong')

# Bolinha
bolinha_X = 300
bolinha_Y = 200
diametro = 10
velocidade_X = 8  
velocidade_Y = 8  

while True:
    tela.fill((0, 0, 0))
    relogio.tick(30)

    for event in pygame.event.get():
        # Fecha a janela
        if event.type == pygame.QUIT:
            pygame.quit()
            exit()

    # Movimento da bolinha
    bolinha_X += velocidade_X
    bolinha_Y += velocidade_Y

    bolinha = pygame.draw.circle(tela, (255, 255, 255), (bolinha_X, bolinha_Y), diametro)

    # Colisão com as bordas e com as bordas de cima e a de baixo
    if bolinha_X >= tela.get_width() - diametro or bolinha_X <= 0:
        velocidade_X = -velocidade_X

    # Colisão com as bordas do lado
    if bolinha_Y >= tela.get_height() - diametro or bolinha_Y <= 0:
        velocidade_Y = -velocidade_Y

    pygame.display.update()

Neste código, adicionei um controle de velocidade vertical (velocidade_Y) e ajustei a lógica para inverter a velocidade quando a bolinha atinge as bordas horizontais ou verticais. Isso fará com que a bolinha ricocheteie corretamente nas bordas da tela. Certifique-se de testar o código e ajustar os valores de velocidade conforme necessário para obter o comportamento desejado.

Seu game fica assim:

Dentro do pygame, mostra a solução criada para ajudar o aluno com a necessidade de ricochetear

Espero ter ajudado e reforço que em casos de dúvidas, conte sempre com o fórum da comunidade Alura! Bons estudos!

Sucesso

Um grande abraço e até mais!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!

Muito obrigado!