Menu
CoddyTech

Eine Ball-Klasse

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

Der Ball ist ein Rect plus zwei Zahlen und die Aufgaben, die er erfüllt: sich bewegen, abprallen und gezeichnet werden. Mach daraus eine Klasse, wie du es bei deinen Sprites getan hast: Eine class hält Daten und die Funktionen, die sie verwenden, zusammen.

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

ball = Ball() erstellt ein Ball-Objekt und führt __init__ aus. Innerhalb der Klasse ist self das Objekt, also ist self.vx das eigene vx dieses Balls. Funktionen in einer Klasse sind Methoden: ball.move() ruft eine davon auf.

Außerhalb der Klasse ist das Rect des Balls jetzt ball.rect und seine Geschwindigkeit ball.vx und ball.vy, sodass der Code für Schläger und Punktestand diese dort ausliest. Das Spiel läuft genauso wie zuvor.

challenge icon

Aufgabe

Schwer

Mach den Ball zu einer Klasse, die sich bewegt und selbst zeichnet.

  1. Schreibe ganz oben class Ball mit __init__ (self.rect, self.vx = 5, self.vy = 4), move() (bewegen und von oben und unten abprallen) und draw(surface).
  2. Erstelle ball = Ball() und rufe in der Schleife ball.move() und ball.draw(screen) auf.
  3. Schreibe überall sonst ball.rect, ball.vx und ball.vy.

Drücke „Spielen“: Das Spiel läuft genau wie zuvor. Drücke dann „Prüfen“.

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
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.x += vx
        ball.y += vy
        if ball.top <= 0 or ball.bottom >= 400:
            vy = -vy
        if ball.colliderect(left):
            vx = abs(vx)
            vy = (ball.centery - left.centery) // 6
        if ball.colliderect(right):
            vx = -abs(vx)
            vy = (ball.centery - right.centery) // 6
        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
        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)
    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 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()

Alle Lektionen in Spiele mit Pygame erstellen

Übe selbstständig: Pygame-Playground