Berlari dan Melompat
Termasuk bagian Dunia Game dalam perjalanan Pygame di Coddy. Pelajaran 29 dari 35.
Sekarang penjelajah bergerak, dengan semua hal dari Gravity dan Jumping serta Platform Collisions, dalam urutan ini pada setiap frame:
- Baca tombol panah ke dalam
dx, bergerak sepanjang sumbu x, lalu dorong keluar dari dinding. - Tambahkan gravitasi hingga
MAX_FALL, bergerak sepanjang sumbu y, mendarat atau terbentur di kepala, lalu aturon_ground. - Jika pemain jatuh melewati batas jendela, kembalikan ke
start.
Lompatan dimulai saat KEYDOWN pada Space atau Up ketika on_ground, dan KEYUP memotong kenaikan cepat menjadi -4 untuk lompatan pendek.
Tambahkan konstanta kecepatan di bagian atas: SPEED = 4, GRAVITY = 1, JUMP = -15, MAX_FALL = 12. Dengan angka-angka ini, lompatan naik sekitar 100 piksel: cukup untuk menaiki dua tile dan melompati lubang selebar dua tile.
Tantangan
Sedang- Tambahkan empat konstanta dan, sebelum perulangan,
vel_y = 0danon_ground = False. - Pada event: lompat dengan Space atau Up saat
on_ground; saatKEYUPsalah satunya, batasivel_ymenjadi -4 jika nilainya di bawah -4. - Setiap frame: gerakkan dan perbaiki posisi x, lalu gerakkan dan perbaiki posisi y seperti pada Bump Your Head.
- Saat
player.top > HEIGHT, aturplayer.midbottom = startdanvel_y = 0.
Coba sendiri
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()
Semua pelajaran di Dunia Game
1Peta dari Teks
Level dalam TeksBaris dan KolomHuruf yang Memiliki MaknaTempat Pemain MemulaiSatu Layar Setiap Kali4Tabrakan dengan Platform
Dinding kiri dan kananMendarat di platformMembentur kepalaJatuh keluar dari levelSatu sumbu setiap kali7Gua Berlumut
Bangun GuaBerlari dan MelompatLatihan sendiri: Playground Pygame