Menu
CoddyTech

Penyangga Lompatan

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

Pemain menekan tombol lompat saat melihat karakter akan mendarat, sering kali beberapa frame terlalu awal. Dengan aksi lompat di dalam event KEYDOWN, tombol yang ditekan mendapati pemain sedang di udara dan input itu terlewat. Pemain merasa game mengabaikan mereka.

Buffer lompatan mengingat tombol yang ditekan selama beberapa frame. Event hanya memulai timer:

elif event.type == pygame.KEYDOWN and event.key in (pygame.K_SPACE, pygame.K_UP):
    jump_timer = JUMP_BUFFER

Setiap frame, sebelum gravitasi, lakukan lompatan jika timer masih berjalan dan pemain berada di tanah, lalu kurangi hitungan timer:

if jump_timer > 0 and on_ground:
    vel_y = JUMP
    jump_timer = 0
if jump_timer > 0:
    jump_timer -= 1

Dengan JUMP_BUFFER = 6, tombol yang ditekan terhitung selama 6 frame, sepersepuluh detik: cukup lama untuk menangkap tombol yang ditekan lebih awal, tetapi cukup singkat agar tombol yang ditekan jauh sebelum mendarat tidak membuat karakter melompat tanpa diduga. Tombol yang ditekan saat berada di tanah tetap membuat karakter melompat pada frame berikutnya.

challenge icon

Tantangan

Sulit
  1. Tambahkan JUMP_BUFFER = 6 di bagian atas dan jump_timer = 0 sebelum perulangan.
  2. Saat terjadi KEYDOWN pada tombol Spasi atau Panah Atas, tetapkan jump_timer = JUMP_BUFFER alih-alih melompat.
  3. Pada setiap frame, sebelum gravitasi: jika jump_timer > 0 dan on_ground, tetapkan vel_y = JUMP dan jump_timer = 0. Lalu, jika jump_timer > 0, kurangi nilainya 1.

Coba sendiri

import pygame

TILE = 36
FLOOR = 324
GRAVITY = 1
JUMP = -15
MAX_FALL = 12

pygame.init()
screen = pygame.display.set_mode((576, 360))
pygame.display.set_caption("Jump Buffer")
clock = pygame.time.Clock()

background = pygame.image.load("assets/backgrounds/clouds.png").convert_alpha()
grass_img = pygame.image.load("assets/images/grass.png").convert_alpha()
player_img = pygame.image.load("assets/images/player.png").convert_alpha()

player = player_img.get_rect(topleft=(264, 40))
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()
    if keys[pygame.K_LEFT]:
        player.x -= 4
    if keys[pygame.K_RIGHT]:
        player.x += 4

    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 x in range(0, 576, TILE):
        screen.blit(grass_img, (x, FLOOR))
    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