Menu
CoddyTech

Mendarat di platform

Termasuk bagian Dunia Game dalam perjalanan Pygame di Coddy. Pelajaran 16 dari 35.

Sekarang biarkan dinding menahan pemain. Setelah gerakan ke samping diperbaiki, gerakkan pemain sepanjang sumbu y dan perbaiki gerakan itu dengan cara yang sama: jika pemain bertumpang tindih dengan dinding saat jatuh, letakkan kakinya di bagian atas dinding.

vel_y = min(vel_y + GRAVITY, MAX_FALL)
player.y += vel_y
on_ground = False
for wall in walls:
    if player.colliderect(wall):
        if vel_y > 0:
            player.bottom = wall.top
            vel_y = 0
            on_ground = True

on_ground dimulai dengan nilai False pada setiap frame, dan hanya pendaratan yang membuatnya bernilai True. Berjalanlah melewati tepi, lalu pada frame berikutnya tidak ada apa pun di bawah pemain, jadi pemain jatuh dan tidak bisa melompat di udara.

Ini menggantikan baris FLOOR: baris terbawah peta adalah tanah seperti dinding lainnya. Gravitasi menarik pemain 1 piksel ke dalam tanah pada setiap frame, lalu pengujian pendaratan mengangkatnya kembali, sehingga pemain tetap berdiri.

challenge icon

Tantangan

Sedang
  1. Hapus pemeriksaan baris FLOOR.
  2. Setelah player.y += vel_y, atur on_ground = False, lalu lakukan perulangan pada walls.
  3. Untuk setiap wall yang ditabrak player saat vel_y > 0: player.bottom = wall.top, vel_y = 0, on_ground = True.

Coba sendiri

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("Landing")
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
    for wall in walls:
        if player.colliderect(wall):
            if dx > 0:
                player.right = wall.left
            elif dx < 0:
                player.left = wall.right

    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()
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Dunia Game

Latihan sendiri: Playground Pygame