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.vxDie 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.
Aufgabe
SchwerVerschiebe die Behandlung von Schlägertreffern und das Zurücksetzen in die Klasse Ball.
- Schreibe
hit(paddle, way): Bei einer Kollisionself.vx = way * abs(self.vx)und den Abschusswinkel. - Schreibe
reset(): Setze den Mittelpunkt auf(300, 200)und kehreself.vxum. - Rufe in der Schleife nach jedem Punkt
ball.hit(left, 1),ball.hit(right, -1)undball.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()
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
1Die Spielschleife
Ein Fenster öffnenDen Hintergrund füllen4Zwei Spieler und ein Ball
Der BallAbprallenÜbe selbstständig: Pygame-Playground