Tirs en angle
Leçon 36 sur 41 du cours Créer des jeux avec Pygame de Coddy.
Dans Pong, l’endroit où la balle frappe la raquette détermine sa direction. 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 milieu de la balle et celui de la raquette, et 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 évite que la balle aille trop vite : un impact tout au bout donne un vy d’environ 7.
Ainsi, Pong devient un jeu d’adresse : tu vises avec ta raquette.
Défi
DifficileFais en sorte que les raquettes dirigent la balle.
- Dans les deux collisions avec une raquette, après avoir défini
vx, définisvycomme la différence entre le centre de la balle et le centre de cette raquette. - Divise cette différence par 6 avec
//.
Appuie sur « Jouer » et frappe la balle avec l’extrémité d’une raquette : elle part en biais. Puis appuie sur « Vérifier ».
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()
Toutes les leçons de Créer des jeux avec Pygame
Entraînez-vous par vous-même : Playground Pygame