Eine flüssige Kamerabewegung
Teil des Abschnitts Sound und Spielgefühl der Pygame-Journey von Coddy. Lektion 17 von 23.
Die Kamera in diesem Straßenspiel ist am Spieler festgeklebt: Was auch immer der Spieler tut, er bleibt in der Mitte des Bildschirms, während die Welt unter ihm hindurchgleitet. Das funktioniert, aber bei jedem Start und Stopp ruckelt die gesamte Ansicht.
Lass die Kamera mit derselben Beschleunigung wie der Kreis folgen. Ihr Ziel ist die Position, die den Spieler in der Mitte platzieren würde:
camera_x += (player.centerx - 240 - camera_x) * 0.1
camera_x = max(0, min(camera_x, WORLD_WIDTH - 480))Der Spieler bewegt sich wie zuvor; nur die Ansicht gleitet sanft. Wenn der Spieler losläuft, hinkt die Kamera ein wenig hinterher, sodass der Spieler der Mitte vorausläuft. Wenn er anhält, gleitet die Kamera nach, bis sie ihn einholt, und kommt wieder mit dem Spieler in der Mitte zur Ruhe. Die zweite Zeile hält die Kamera weiterhin innerhalb der Welt.
Die Welt wird wie zuvor bei -int(camera_x) gezeichnet. camera_x ist jetzt eine Dezimalzahl; int() sorgt dafür, dass die Zeichnung auf ganzen Pixeln liegt, während die Variable ihren exakten Wert für den nächsten Frame beibehält.
Ein Menüfeld, das hereingleitet, ein Gesundheitsbalken, der sich leert, eine Punktzahl, die hochzählt: Alles, was sich zu einem neuen Wert bewegt, kann auf dieselbe Weise sanft übergehen.
Aufgabe
MittelLass die Kamera sanft folgen: Ersetze camera_x = player.centerx - 240 durch eine Zeile, die camera_x in jedem Frame ein Zehntel des Weges in Richtung player.centerx - 240 bewegt. Behalte die Zeile bei, die den Wert begrenzt.
Probier es selbst
import pygame
pygame.init()
screen = pygame.display.set_mode((480, 360))
pygame.display.set_caption("Long Road")
clock = pygame.time.Clock()
WORLD_WIDTH = 1440
player = pygame.Rect(220, 240, 40, 40)
camera_x = 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_LEFT]:
player.x -= 6
if keys[pygame.K_RIGHT]:
player.x += 6
player.left = max(player.left, 0)
player.right = min(player.right, WORLD_WIDTH)
camera_x = player.centerx - 240
camera_x = max(0, min(camera_x, WORLD_WIDTH - 480))
screen.fill((30, 30, 46))
pygame.draw.rect(screen, (80, 80, 100), (0, 280, 480, 80))
for post_x in range(0, WORLD_WIDTH, 120):
pygame.draw.rect(screen, (80, 160, 255), (post_x - int(camera_x), 220, 20, 60))
pygame.draw.rect(screen, (90, 200, 120), player.move(-int(camera_x), 0))
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 Sound und Spielgefühl
5Flüssige Bewegung
Auf ein Ziel zubewegenEine flüssige KamerabewegungBeim Aufsammeln aufspringenBei jeder Bildrate flüssigÜbe selbstständig: Pygame-Playground