Laufen und Springen
Teil des Abschnitts Spielwelten der Pygame-Journey von Coddy. Lektion 29 von 35.
Jetzt bewegt sich der Entdecker, wobei in jedem Frame alles aus Schwerkraft, Springen und Plattformkollisionen in dieser Reihenfolge geschieht:
- Lies die Pfeiltasten in
dxein, bewege dich entlang der x-Achse und drücke dich aus den Wänden heraus. - Addiere die Schwerkraft bis zu
MAX_FALL, bewege dich entlang der y-Achse, lande oder stoße mit dem Kopf an und setzeon_ground. - Wenn der Spieler unter das Fenster gefallen ist, setze ihn zurück auf
start.
Der Sprung beginnt bei einem KEYDOWN der Leertaste oder der Pfeiltaste nach oben, wenn on_ground gilt, und ein KEYUP bremst einen schnellen Aufstieg für kurze Sprünge auf -4 ab.
Füge oben die Geschwindigkeitskonstanten hinzu: SPEED = 4, GRAVITY = 1, JUMP = -15, MAX_FALL = 12. Mit diesen Werten steigt ein Sprung etwa 100 Pixel hoch: genug für eine Stufe aus zwei Kacheln und um eine Grube von zwei Kacheln zu überwinden.
Aufgabe
Mittel- Füge die vier Konstanten sowie vor der Schleife
vel_y = 0undon_ground = Falsehinzu. - Bei den Ereignissen: Springe mit Leertaste oder Pfeil nach oben, wenn
on_ground; beiKEYUPeiner der beiden Tasten setzevel_yauf -4, wenn der Wert unter -4 liegt. - Bewege in jedem Frame zuerst x und korrigiere die Position, dann bewege y und korrigiere die Position wie in „Bump Your Head“.
- Wenn
player.top > HEIGHT, setzeplayer.midbottom = startundvel_y = 0.
Probier es selbst
import pygame
TILE = 36
WIDTH, HEIGHT = 576, 360
LEVEL = [
"................................................................",
"................................................................",
"................................................................",
"................................................................",
"#..............................................................#",
"#....................C.........................#####...........#",
"#......CC...C................CC.....CC.........#####.....CC....#",
"#....................#.........................D...............#",
"#.P.........#...E....#...^.......K......E......D.C....^......F.#",
"#######..####################..##########################..#####",
]
pygame.init()
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Moss Caves")
clock = pygame.time.Clock()
def load(name):
return pygame.image.load("assets/images/" + name).convert_alpha()
background = pygame.image.load("assets/backgrounds/forest.png").convert_alpha()
grass_img = load("grass.png")
grass_left_img = load("grass_left.png")
grass_right_img = load("grass_right.png")
dirt_img = load("dirt.png")
player_img = load("player.png")
def solid(row, col):
if row < 0 or row >= len(LEVEL) or col < 0 or col >= len(LEVEL[0]):
return False
return LEVEL[row][col] == "#"
walls = []
tiles = []
for row, line in enumerate(LEVEL):
for col, char in enumerate(line):
rect = pygame.Rect(col * TILE, row * TILE, TILE, TILE)
if char == "#":
if solid(row - 1, col):
image = dirt_img
elif not solid(row, col - 1) and solid(row, col + 1):
image = grass_left_img
elif solid(row, col - 1) and not solid(row, col + 1):
image = grass_right_img
else:
image = grass_img
walls.append(rect)
tiles.append((image, rect))
elif char == "P":
start = rect.midbottom
player = player_img.get_rect(midbottom=start)
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
for y in range(0, HEIGHT, 72):
for x in range(0, WIDTH, 72):
screen.blit(background, (x, y))
for image, rect in tiles:
screen.blit(image, rect)
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