Menu
CoddyTech

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:

  1. Baca tombol panah ke dalam dx, bergerak sepanjang sumbu x, lalu dorong keluar dari dinding.
  2. Tambahkan gravitasi hingga MAX_FALL, bergerak sepanjang sumbu y, mendarat atau terbentur di kepala, lalu atur on_ground.
  3. 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.

challenge icon

Tantangan

Sedang
  1. Tambahkan empat konstanta dan, sebelum perulangan, vel_y = 0 dan on_ground = False.
  2. Pada event: lompat dengan Space atau Up saat on_ground; saat KEYUP salah satunya, batasi vel_y menjadi -4 jika nilainya di bawah -4.
  3. Setiap frame: gerakkan dan perbaiki posisi x, lalu gerakkan dan perbaiki posisi y seperti pada Bump Your Head.
  4. Saat player.top > HEIGHT, atur player.midbottom = start dan vel_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

Latihan sendiri: Playground Pygame