Ein Bildschirm nach dem anderen
Teil des Abschnitts Spielwelten der Pygame-Journey von Coddy. Lektion 5 von 35.
Ein Level kann breiter als das Fenster sein. Diese Karte hat 32 Spalten, also zwei Fenster mit je 16 Spalten. Die Wände behalten ihre Positionen im Level: Eine Wand in Spalte 20 befindet sich bei x = 720, hinter dem rechten Fensterrand bei 576.
Die Breite des Levels ergibt sich aus der Karte: len(LEVEL[0]) * TILE. Halte den Spieler innerhalb des Levels, nicht innerhalb des Fensters:
level_width = len(LEVEL[0]) * TILE
level = pygame.Rect(0, 0, level_width, 360)
# in der Schleife
player.clamp_ip(level)Um den Teil des Levels anzuzeigen, in dem sich der Spieler befindet, teile es in Bildschirme mit einer Breite von 576 Pixeln auf. player.centerx // 576 ist die Bildschirmnummer, 0 oder 1. Zeichne alles um die entsprechende Anzahl an Fensterbreiten nach links verschoben:
offset = player.centerx // 576 * 576
pygame.draw.rect(screen, WALL, wall.move(-offset, 0))wall.move(-offset, 0) ist eine Kopie des Rect, die nach links verschoben wurde; die Wand selbst bleibt an ihrer Position im Level. Geh über den Rand hinaus, und das Fenster zeigt den nächsten Bildschirm. Der Spieler geht weiterhin durch Wände hindurch: Wie du ihn an ihnen stoppst, lernst du in „Kollisionen mit Plattformen“.
Aufgabe
Mittel- Erstelle vor der Spielschleife
level_width = len(LEVEL[0]) * TILEundlevel = pygame.Rect(0, 0, level_width, 360). - Halte den Spieler innerhalb von
levelstatt vonscreen.get_rect(). - Setze in jedem Frame
offset = player.centerx // 576 * 576. - Zeichne jede Wand, jede Münze und den Spieler auf der x-Achse um
-offsetverschoben.
Probier es selbst
import pygame
TILE = 36
WALL = (120, 90, 60)
COIN = (255, 196, 0)
PLAYER = (80, 200, 120)
LEVEL = [
"################################",
"#..............................#",
"#.C..####...C.........C...###..#",
"#..............#####...........#",
"#....C....##..........##....C..#",
"#..##.....##.C.....C..##.......#",
"#..##..P..........####.....C...#",
"#.C.......###..............##..#",
"#..............................#",
"####..####..########..####..####",
]
pygame.init()
screen = pygame.display.set_mode((576, 360))
pygame.display.set_caption("Map from Text")
clock = pygame.time.Clock()
walls = []
coins = []
for row, line in enumerate(LEVEL):
for col, char in enumerate(line):
if char == "#":
walls.append(pygame.Rect(col * TILE, row * TILE, TILE, TILE))
elif char == "C":
coins.append(pygame.Rect(col * TILE + 10, row * TILE + 10, 16, 16))
elif char == "P":
player = pygame.Rect(col * TILE + 4, row * TILE + 4, 28, 28)
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 -= 4
if keys[pygame.K_RIGHT]:
player.x += 4
if keys[pygame.K_UP]:
player.y -= 4
if keys[pygame.K_DOWN]:
player.y += 4
player.clamp_ip(screen.get_rect())
screen.fill((30, 30, 46))
for wall in walls:
pygame.draw.rect(screen, WALL, wall)
for coin in coins:
pygame.draw.rect(screen, COIN, coin)
pygame.draw.rect(screen, PLAYER, player)
pygame.display.flip()
clock.tick(60)
pygame.quit()
Alle Lektionen in Spielwelten
1Karten aus Text
Ein Level in TextformZeilen und SpaltenBuchstaben mit BedeutungWo der Spieler startetEin Bildschirm nach dem anderen4Kollisionen mit Plattformen
Wände links und rechtsAuf Plattformen landenStoß dir den KopfAus dem Level fallenEine Achse nach der anderen3Schwerkraft und Springen
Fallen mit SchwerkraftVom Boden springenKurze SprüngeEine maximale FallgeschwindigkeitSprungpuffer6Patrouillierende Gegner
Ein patrouillierender BlobDrauftreten oder getroffen werdenEin GehzyklusGegner aus der KarteÜbe selbstständig: Pygame-Playground