Treffen und Zurücksetzen als Methoden
Teil des Abschnitts Projekte der Pygame-Journey von Coddy. Lektion 21 von 33.
Zwei weitere Aufgaben gehören zum Ball: von einem Schläger abprallen und in die Mitte zurückkehren. Als Methoden gelesen, bildet die Hauptschleife die Spielregeln ab.
def reset(self):
self.rect.center = (300, 200)
self.vx = -self.vxDie beiden Schlägerprüfungen unterscheiden sich nur darin, in welche Richtung der Ball wegfliegt: nach rechts vom linken Schläger, nach links vom rechten. Übergib das als Zahl, way, 1 oder -1, dann genügt eine Methode für beide:
ball.hit(left, 1)
ball.hit(right, -1)Im Inneren schickt self.vx = way * abs(self.vx) den Ball in diese Richtung, unabhängig davon, wie er sich zuvor bewegt hat, und der Schusswinkel bleibt unverändert.
Aufgabe
SchwerVerschiebe den Treffer mit dem Schläger 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. 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 Projekte
2Pong für zwei
Der BallAbprallenÜbe selbstständig: Pygame-Playground