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_BUFFERSetiap 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 -= 1Dengan 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.
Tantangan
Sulit- Tambahkan
JUMP_BUFFER = 6di bagian atas danjump_timer = 0sebelum perulangan. - Saat terjadi
KEYDOWNpada tombol Spasi atau Panah Atas, tetapkanjump_timer = JUMP_BUFFERalih-alih melompat. - Pada setiap frame, sebelum gravitasi: jika
jump_timer > 0danon_ground, tetapkanvel_y = JUMPdanjump_timer = 0. Lalu, jikajump_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()
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Dunia Game
1Peta dari Teks
Level dalam TeksBaris dan KolomHuruf yang Memiliki MaknaTempat Pemain MemulaiSatu Layar Setiap Kali3Gravitasi dan Melompat
Jatuh karena GravitasiMelompat dari TanahLompatan PendekKecepatan Jatuh MaksimumPenyangga LompatanLatihan sendiri: Playground Pygame