Menu
CoddyTech

Den Schläger treffen

Teil des Abschnitts Projekte der Pygame-Journey von Coddy. Lektion 14 von 31.

Wenn der Ball einen Schläger berührt, sollte er in die andere Richtung zurückfliegen. ball.colliderect(right) sagt dir, ob sie sich berühren.

Das Vorzeichen umzudrehen, vx = -vx, birgt eine Falle. Wenn sich der Ball im nächsten Frame noch im Schläger befindet (er hat das Ende des Schlägers erwischt oder der Schläger ist auf ihn zugefahren), wird das Vorzeichen immer wieder umgedreht: Der Ball zittert im Schläger.

Lege die Richtung fest, statt das Vorzeichen umzudrehen. abs(vx) ist vx ohne Vorzeichen, also immer positiv:

if ball.colliderect(left):
    vx = abs(vx)
if ball.colliderect(right):
    vx = -abs(vx)

Vom linken Schläger fliegt der Ball immer nach rechts und vom rechten Schläger immer nach links, egal wie viele Frames sie sich berühren.

challenge icon

Aufgabe

Mittel

Nach dem Abprallen an der Wand: Wenn der Ball mit left kollidiert, setze vx = abs(vx); wenn er mit right kollidiert, setze vx = -abs(vx).

Probier es selbst

import pygame

pygame.init()
screen = pygame.display.set_mode((600, 400))
pygame.display.set_caption("Pong")
clock = pygame.time.Clock()

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)

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = 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())

    ball.x += vx
    ball.y += vy
    if ball.top <= 0 or ball.bottom >= 400:
        vy = -vy

    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)
    pygame.display.flip()
    clock.tick(60)

pygame.quit()
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Projekte

Übe selbstständig: Pygame-Playground