Menu
CoddyTech

Winkelschüsse

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

Bei Pong entscheidet die Stelle, an der der Ball den Schläger trifft, wohin er fliegt. Nahe dem oberen Ende fliegt er nach oben, nahe dem unteren Ende nach unten und in der Mitte geradeaus.

Miss, wie weit die Mitte des Balls von der Mitte des Schlägers entfernt ist, und mache daraus das neue vy:

if ball.colliderect(right):
    vx = -abs(vx)
    vy = (ball.centery - right.centery) // 6

Oberhalb der Mitte ist die Differenz negativ, also fliegt der Ball nach oben; unterhalb ist sie positiv. Durch das Teilen durch 6 wird der Ball nicht zu schnell: Ein Treffer ganz am Rand ergibt einen vy-Wert von etwa 7.

So wird Pong zu einem Geschicklichkeitsspiel: Du zielst mit deinem Schläger.

challenge icon

Aufgabe

Schwer

Bei beiden Schlägerkollisionen setzt du nach dem Festlegen von vx vy auf die Mitte des Balls minus die Mitte des jeweiligen Schlägers, geteilt durch 6 mit //.

Probier es selbst

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()
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