Aufschlag
Teil des Abschnitts Projekte der Pygame-Journey von Coddy. Lektion 17 von 31.
Nach einem Punkt sollte der Ball in der Mitte warten, bis ein Spieler bereit ist. Ein Flag gibt an, ob er wartet:
waiting = False
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:
waiting = False
# Die Schläger bewegen sich immer
if not waiting:
# Der Ball bewegt sich, prallt ab und erzielt Punkte; ein Punkt setzt waiting = TrueDie Schläger bleiben außerhalb des if, damit die Spieler sich bereit machen können, während der Ball wartet. Die Leertaste löst bei jedem Drücken genau eine Aktion aus, daher wird sie durch ein KEYDOWN-Ereignis erfasst.
Während der Ball wartet, zeige unten in der Nähe, zentriert bei (300, 360), die Meldung Press Space to serve an.
Aufgabe
Mittel- Setze vor der Schleife
waiting = False. - Führe die Bewegung des Balls, die Abpraller und die Punktewertung unter
if not waiting:aus und setze nach jedem Punktwaiting = True. - Ein KEYDOWN-Ereignis für
pygame.K_SPACEsetztwaiting = False. - Zeige während des Wartens
Press Space to servezentriert bei(300, 360)an.
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
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = 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())
ball.x += vx
ball.y += vy
if ball.top <= 0 or ball.bottom >= 400:
vy = -vy
if ball.colliderect(left):
vx = abs(vx)
if ball.colliderect(right):
vx = -abs(vx)
if ball.left > 600:
left_score += 1
ball.center = (300, 200)
vx = -vx
if ball.right < 0:
right_score += 1
ball.center = (300, 200)
vx = -vx
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)))
pygame.display.flip()
clock.tick(60)
pygame.quit()
Alle Lektionen in Projekte
Übe selbstständig: Pygame-Playground