Winkelschüsse
Teil des Abschnitts Projekte der Pygame-Journey von Coddy. Lektion 18 von 31.
Bei Pong entscheidet die Stelle, an der der Ball den Schläger trifft, wohin er fliegt. Nahe dem oberen Ende fliegt er nach oben, nahe dem 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 das Teilen durch 6 wird der Ball nicht zu schnell: Ein Treffer ganz am Rand ergibt einen vy-Wert von etwa 7.
So wird Pong zu einem Geschicklichkeitsspiel: Du zielst mit deinem Schläger.
Aufgabe
SchwerBei beiden Schlägerkollisionen setzt du nach dem Festlegen von vx vy auf die Mitte des Balls minus die Mitte des jeweiligen Schlägers, geteilt durch 6 mit //.
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()
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Projekte
Übe selbstständig: Pygame-Playground