Winkelschüsse
Lektion 36 von 41 im Kurs Spiele mit Pygame erstellen von Coddy.
Bei Pong entscheidet die Stelle, an der der Ball den Schläger trifft, wohin er fliegt. Nahe am oberen Ende fliegt er nach oben, nahe am unteren Ende nach unten und in der Mitte geradeaus.
Miss, wie weit die Mitte des Balls von der Mitte des Schlägers entfernt ist, und mache daraus das neue vy:
if ball.colliderect(right):
vx = -abs(vx)
vy = (ball.centery - right.centery) // 6Oberhalb der Mitte ist die Differenz negativ, also fliegt der Ball nach oben; unterhalb ist sie positiv. Durch die Division durch 6 wird er nicht zu schnell: Bei einem Treffer ganz am Ende ergibt sich ein vy von etwa 7.
Dadurch wird Pong zu einem Geschicklichkeitsspiel: Du zielst mit deinem Schläger.
Aufgabe
SchwerLass die Schläger den Ball ausrichten.
- Setze bei beiden Schlägerkollisionen nach dem Festlegen von
vxvyauf die Mitte des Balls minus die Mitte des jeweiligen Schlägers. - Teile den Wert mit
//durch 6.
Drücke auf „Spielen“ und schlage den Ball mit dem Ende eines Schlägers: Er fliegt schräg davon. Drücke dann auf „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
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:
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)
if ball.colliderect(right):
vx = -abs(vx)
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
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 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