Menu
CoddyTech

Membentur kepala

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

Melompatlah di bawah platform, lalu pemain akan melewatinya ke atas dan mendarat di atasnya. Platform yang kokoh seharusnya menghentikan kepala pemain. Saat bergerak ke atas, vel_y bernilai negatif, jadi tambahkan kasus lainnya ke perulangan vertikal:

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
            on_ground = True
        elif vel_y < 0:
            player.top = wall.bottom
        vel_y = 0

Kepala pemain bergerak ke bagian bawah dinding, dan kecepatannya menjadi 0 dalam kedua kasus. Setelah terbentur, gravitasi langsung mulai membuat pemain jatuh. Tanpa vel_y = 0, pemain terus mencoba bergerak ke atas dan tersangkut di bawah platform sampai gravitasi menghabiskan lompatan.

Tanda vel_y menunjukkan dari sisi mana pemain datang, seperti dx untuk dinding: saat jatuh, pemain membentur bagian atas dinding; saat naik, bagian bawahnya.

challenge icon

Tantangan

Mudah
  1. Dalam perulangan tabrakan vertikal, tambahkan kasus vel_y < 0: player.top = wall.bottom.
  2. Tetapkan vel_y = 0 setelah kedua kasus, agar benturan menghentikan gerakan naik.

Pemain mulai di bawah platform. Lompat untuk mencobanya.

Coba sendiri

import pygame

TILE = 36
SPEED = 4
GRAVITY = 1
JUMP = -15
MAX_FALL = 12

LEVEL = [
    "................",
    "................",
    "................",
    "..........###...",
    "................",
    "................",
    "...#####........",
    "............#...",
    "#....P......#..#",
    "################",
]

pygame.init()
screen = pygame.display.set_mode((576, 360))
pygame.display.set_caption("Head Bump")
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
    for wall in walls:
        if player.colliderect(wall):
            if vel_y > 0:
                player.bottom = wall.top
                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()

Semua pelajaran di Dunia Game

Latihan sendiri: Playground Pygame