Toucher et réinitialiser avec des méthodes
Fait partie de la section Projets du Journey Pygame de Coddy. Leçon 21 sur 33.
Deux autres tâches incombent à la balle : rebondir sur une raquette et retourner au milieu. Sous forme de méthodes, la boucle principale se lit comme les règles du jeu.
def reset(self):
self.rect.center = (300, 200)
self.vx = -self.vxLes deux tests de raquette ne diffèrent que par la direction dans laquelle la balle repart : vers la droite après avoir touché la raquette de gauche, vers la gauche après avoir touché celle de droite. Passe cette direction sous forme de nombre, way, 1 ou -1, et une seule méthode suffit pour les deux :
ball.hit(left, 1)
ball.hit(right, -1)À l’intérieur, self.vx = way * abs(self.vx) envoie la balle dans cette direction, quelle que soit celle dans laquelle elle se déplaçait, et l’angle du tir reste inchangé.
Défi
DifficileDéplace le traitement des collisions avec les raquettes et la réinitialisation dans la classe Ball.
- Écris
hit(paddle, way): en cas de collision,self.vx = way * abs(self.vx)et l’angle de tir. - Écris
reset(): centre à(300, 200)et inverseself.vx. - Dans la boucle, appelle
ball.hit(left, 1),ball.hit(right, -1)etball.reset()après chaque point.
Appuie sur « Jouer » : le jeu fonctionne toujours de la même façon. Puis clique sur « Vérifier ».
Essayez vous-même
import pygame
class Ball:
def __init__(self):
self.rect = pygame.Rect(293, 193, 14, 14)
self.vx = 5
self.vy = 4
def move(self):
self.rect.x += self.vx
self.rect.y += self.vy
if self.rect.top <= 0 or self.rect.bottom >= 400:
self.vy = -self.vy
def draw(self, surface):
pygame.draw.rect(surface, (255, 196, 0), self.rect)
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 = Ball()
left = pygame.Rect(20, 160, 12, 80)
right = pygame.Rect(568, 160, 12, 80)
left_score = 0
right_score = 0
waiting = False
winner = None
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:
if winner is None:
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.move()
if ball.rect.colliderect(left):
ball.vx = abs(ball.vx)
ball.vy = (ball.rect.centery - left.centery) // 6
if ball.rect.colliderect(right):
ball.vx = -abs(ball.vx)
ball.vy = (ball.rect.centery - right.centery) // 6
if ball.rect.left > 600:
left_score += 1
ball.rect.center = (300, 200)
ball.vx = -ball.vx
waiting = True
if ball.rect.right < 0:
right_score += 1
ball.rect.center = (300, 200)
ball.vx = -ball.vx
waiting = True
if left_score == 5:
winner = "Left player wins!"
elif right_score == 5:
winner = "Right player wins!"
screen.fill((30, 30, 46))
pygame.draw.rect(screen, (80, 160, 255), left)
pygame.draw.rect(screen, (235, 80, 80), right)
ball.draw(screen)
score = font.render(f"{left_score} : {right_score}", True, (240, 240, 240))
screen.blit(score, score.get_rect(center=(300, 30)))
if winner is not None:
message = font.render(winner, True, (240, 240, 240))
screen.blit(message, message.get_rect(center=(300, 120)))
elif 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
2Pong à deux
La balleRebondirEntraînez-vous par vous-même : Playground Pygame