Tirs en angle
Fait partie de la section Projets du Journey Pygame de Coddy. Leçon 18 sur 31.
Dans Pong, l’endroit où la balle touche la raquette détermine sa trajectoire. Près du haut, elle part vers le haut ; près du bas, vers le bas ; et au milieu, tout droit.
Mesure la distance entre le centre de la balle et celui de la raquette, puis utilise cette valeur comme nouveau vy :
if ball.colliderect(right):
vx = -abs(vx)
vy = (ball.centery - right.centery) // 6Au-dessus du milieu, la différence est négative, donc la balle part vers le haut ; en dessous, elle est positive. La division par 6 l’empêche d’aller trop vite : un impact tout au bout donne un vy d’environ 7.
Pong devient ainsi un jeu d’adresse : tu vises avec ta raquette.
Défi
DifficileDans les deux collisions avec les raquettes, après avoir défini vx, définissez vy comme la différence entre le centre de la balle et celui de la raquette, divisée par 6 avec //.
Essayez vous-même
import pygame
pygame.init()
screen = pygame.display.set_mode((600, 400))
pygame.display.set_caption("Pong")
clock = pygame.time.Clock()
font = pygame.font.Font(None, 36)
ball = pygame.Rect(293, 193, 14, 14)
vx, vy = 5, 4
left = pygame.Rect(20, 160, 12, 80)
right = pygame.Rect(568, 160, 12, 80)
left_score = 0
right_score = 0
waiting = False
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE:
waiting = False
keys = pygame.key.get_pressed()
if keys[pygame.K_w]:
left.y -= 6
if keys[pygame.K_s]:
left.y += 6
if keys[pygame.K_UP]:
right.y -= 6
if keys[pygame.K_DOWN]:
right.y += 6
left.clamp_ip(screen.get_rect())
right.clamp_ip(screen.get_rect())
if not waiting:
ball.x += vx
ball.y += vy
if ball.top <= 0 or ball.bottom >= 400:
vy = -vy
if ball.colliderect(left):
vx = abs(vx)
if ball.colliderect(right):
vx = -abs(vx)
if ball.left > 600:
left_score += 1
ball.center = (300, 200)
vx = -vx
waiting = True
if ball.right < 0:
right_score += 1
ball.center = (300, 200)
vx = -vx
waiting = True
screen.fill((30, 30, 46))
pygame.draw.rect(screen, (80, 160, 255), left)
pygame.draw.rect(screen, (235, 80, 80), right)
pygame.draw.rect(screen, (255, 196, 0), ball)
score = font.render(f"{left_score} : {right_score}", True, (240, 240, 240))
screen.blit(score, score.get_rect(center=(300, 30)))
if waiting:
message = font.render("Press Space to serve", True, (240, 240, 240))
screen.blit(message, message.get_rect(center=(300, 360)))
pygame.display.flip()
clock.tick(60)
pygame.quit()
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Projets
Entraînez-vous par vous-même : Playground Pygame