Wände links und rechts
Teil des Abschnitts Spielwelten der Pygame-Journey von Coddy. Lektion 15 von 35.
Die Blöcke werden gezeichnet, aber der Spieler läuft durch sie hindurch. Eine Wand muss den Spieler aufhalten. Bewege ihn zuerst und korrigiere dann die Bewegung: Wenn sich der Spieler nun mit einer Wand überschneidet, schiebe ihn auf der Seite, von der er gekommen ist, wieder heraus.
player.x += dx
for wall in walls:
if player.colliderect(wall):
if dx > 0:
player.right = wall.left
elif dx < 0:
player.left = wall.rightdx ist die seitliche Bewegung in diesem Frame: positiv bedeutet nach rechts. Bewegt sich der Spieler nach rechts, trifft er auf die linke Seite der Wand, also kommt seine rechte Kante dorthin. Bewegt er sich nach links, kommt seine linke Kante an die rechte Seite der Wand.
Die Karte ist in walls eingebaut, einer Liste von Rects, genauso wie in „Maps from Text“. Der Boden ist weiterhin die Linie bei FLOOR, und der Spieler kann weiterhin auf einen Block fallen: Als Nächstes geht es um das Landen auf Wänden.
Aufgabe
Mittel- Gehe nach
player.x += dxdiewallsdurch. - Für jede Wand, mit der der Spieler kollidiert: Wenn
dx > 0, setzeplayer.right = wall.left; wenndx < 0, setzeplayer.left = wall.right.
Probier es selbst
import pygame
TILE = 36
SPEED = 4
GRAVITY = 1
JUMP = -15
MAX_FALL = 12
FLOOR = 324
LEVEL = [
"................",
"................",
"................",
"................",
"................",
"................",
"................",
"#..........##..#",
"#.P..#.....##..#",
"################",
]
pygame.init()
screen = pygame.display.set_mode((576, 360))
pygame.display.set_caption("Walls")
clock = pygame.time.Clock()
background = pygame.image.load("assets/backgrounds/clouds.png").convert_alpha()
block_img = pygame.image.load("assets/images/block.png").convert_alpha()
player_img = pygame.image.load("assets/images/player.png").convert_alpha()
walls = []
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 == "P":
start = (col * TILE + TILE // 2, row * TILE + TILE)
player = player_img.get_rect(midbottom=start)
vel_y = 0
on_ground = 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 in (pygame.K_SPACE, pygame.K_UP):
if on_ground:
vel_y = JUMP
elif event.type == pygame.KEYUP and event.key in (pygame.K_SPACE, pygame.K_UP):
if vel_y < -4:
vel_y = -4
keys = pygame.key.get_pressed()
dx = 0
if keys[pygame.K_LEFT]:
dx -= SPEED
if keys[pygame.K_RIGHT]:
dx += SPEED
player.x += dx
vel_y = min(vel_y + GRAVITY, MAX_FALL)
player.y += vel_y
on_ground = False
if player.bottom > FLOOR:
player.bottom = FLOOR
vel_y = 0
on_ground = True
for y in range(0, 360, 72):
for x in range(0, 576, 72):
screen.blit(background, (x, y))
for wall in walls:
screen.blit(block_img, wall)
screen.blit(player_img, 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