Menu
CoddyTech

Treffen und Zurücksetzen als Methoden

Lektion 39 von 41 im Kurs Spiele mit Pygame erstellen von Coddy.

Zwei weitere Aufgaben hat der Ball: vom Schläger abprallen und in die Mitte zurückkehren. Als Methoden liest sich die Hauptschleife wie die Spielregeln.

def reset(self):
    self.rect.center = (300, 200)
    self.vx = -self.vx

Die beiden Schlägertests unterscheiden sich nur darin, in welche Richtung der Ball wegfliegt: vom linken Schläger nach rechts, vom rechten nach links. Übergib diese Richtung als Zahl, way, 1 oder -1, und eine Methode übernimmt beides:

ball.hit(left, 1)
ball.hit(right, -1)

Innerhalb der Methode schickt self.vx = way * abs(self.vx) den Ball in diese Richtung, unabhängig davon, wie er sich bewegt hat, und der Abschusswinkel bleibt unverändert.

challenge icon

Aufgabe

Schwer

Verschiebe die Behandlung von Schlägertreffern und das Zurücksetzen in die Klasse Ball.

  1. Schreibe hit(paddle, way): Bei einer Kollision self.vx = way * abs(self.vx) und den Abschusswinkel.
  2. Schreibe reset(): Setze den Mittelpunkt auf (300, 200) und kehre self.vx um.
  3. Rufe in der Schleife nach jedem Punkt ball.hit(left, 1), ball.hit(right, -1) und ball.reset() auf.

Drücke „Spielen“: Das Spiel läuft weiterhin genauso ab. Drücke dann „Prüfen“.

Probier es selbst

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()
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 Spiele mit Pygame erstellen

Übe selbstständig: Pygame-Playground