Zum Hauptinhalt springen

Das Paddle bewegen

Um das Paddle zu bewegen, legen wir zuerst eine Geschwindigkeit fest (Zeile 15): um so viel soll das Paddle in jeden Frame bewegt werden, wenn die entsprechende Pfeiltaste gedrückt ist.

Um das Paddle bewegbar zu machen, fügen wir seiner Klasse die zwei Methoden left() und right() hinzu (Zeilen 62-70). Die Logik funktioniert folgendermassen: Wenn das Paddle nach links bewegt werden soll, dann reduzieren wir die x-Koordinate seines Rechtecks (self.rect.center[0]) einmal um den Geschwindigkeitswert von Zeile 15 (zur Erinnerung: die Koordinate 0,0 ist oben links). Für die Bewegung nach rechts wird die x-Koordinate stattdessen erhöht.

Nun müssen wir noch entscheiden, wann welche Methode aufgerufen werden soll. Das tun wir auf den Zeilen 99-103. Dazu fragen wir Pygame zuerst nach pygame.key.get_pressed(). Wir erhalten damit eine Liste von Booleans, wobei jeder Eintrag für eine bestimmte Taste steht. Wenn der Eintrag für diese Taste True ist, bedeutet dass, dass die Taste zum Zeitpunkt der Abfrage gedrückt war. Ist der Eintrag False, so war die Taste nicht gedrückt. Den entsprechenden Eintrag finden wir über die Konstanten pygame.K_LEFT und pygame.K_RIGHT, für die linke und rechte Pfeiltaste. Diese beiden Werte sind dabei einfach nur Zahlen, mit denen wir auf das entsprechende Listenelement zugreifen können. Wir sagen also: Wenn zum Zeitpunkt der Abfrage die Taste K_LEFT (linke Pfeiltaste) gedrückt ist, dann soll auf dem Paddle die Methode left() aufgerufen werden, und analog für K_RIGHT und right().

import pygame

# Spiel initialisieren
pygame.init()

# Einstellungen für das Fenster
window_width = 800
window_height = 600

# Hintergrundfarbe festlegen
background_color = pygame.color.Color("black")

# Einstellungen für das Paddle
paddle_y = 540
paddle_speed = 3

# Pygame-Fenster vorbereiten
pygame.display.set_caption("Breakout 👾")
screen = pygame.display.set_mode([window_width, window_height])

# Zugriff auf die Uhr -> damit können wir die Geschwindigkeit des Spiels anpassen
clock = pygame.time.Clock()

class Ball(pygame.sprite.Sprite):
def __init__(self, x, y):
super().__init__()
ball_image = pygame.image.load("sprites/58-Breakout-Tiles.png")
self.image = pygame.transform.scale(ball_image, (50, 50))
self.rect = self.image.get_rect()
self.rect.center = (x, y)
self.direction = (-1, -2)

def move(self):
new_x = self.rect.center[0] + self.direction[0]
new_y = self.rect.center[1] + self.direction[1]
self.rect.center = (new_x, new_y)

def flip_x_direction(self):
new_x_direction = self.direction[0] * -1
new_y_direction = self.direction[1]
self.direction = (new_x_direction, new_y_direction)

def flip_y_direction(self):
new_x_direction = self.direction[0]
new_y_direction = self.direction[1] * -1
self.direction = (new_x_direction, new_y_direction)

def hits_top_of_window(self):
return self.rect.top <= 0

def hits_side_of_window(self):
return self.rect.left <= 0 or self.rect.right >= window_width

class Paddle(pygame.sprite.Sprite):
def __init__(self, x, y):
super().__init__()
paddle_image = pygame.image.load("sprites/49-Breakout-Tiles.png")
self.image = pygame.transform.scale(paddle_image, (150, 40))
self.rect = self.image.get_rect()
self.rect.center = (x, y)

def left(self):
new_x = self.rect.center[0] - paddle_speed
new_y = self.rect.center[1]
self.rect.center = (new_x, new_y)

def right(self):
new_x = self.rect.center[0] + paddle_speed
new_y = self.rect.center[1]
self.rect.center = (new_x, new_y)

ball = Ball(500, 300)
balls = pygame.sprite.Group()
balls.add(ball)

paddle = Paddle(window_width / 2, paddle_y)
paddles = pygame.sprite.Group(paddle)

run = True
while run:
clock.tick(100)
screen.fill(background_color)

ball.move()
balls.update()
balls.draw(screen)

paddles.update()
paddles.draw(screen)

if ball.hits_top_of_window():
ball.flip_y_direction()

if ball.hits_side_of_window():
ball.flip_x_direction()

pygame.display.flip()

keys_pressed = pygame.key.get_pressed()
if keys_pressed[pygame.K_LEFT]:
paddle.left()
if keys_pressed[pygame.K_RIGHT]:
paddle.right()

for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False

Nun können wir das Paddle auch bereits bewegen. Leider fällt der Ball momentan aber einfach noch hindurch. Das Problem lösen wir im nächsten Schritt.