Zıplama Tamponu
Coddy'nin Pygame Journey'sinin Dünyalar bölümünün bir parçası. Ders 14 / 35.
Oyuncular, yere inişin yaklaştığını gördüklerinde genellikle birkaç kare çok erken zıplama tuşuna basar. Zıplama işlemi KEYDOWN olayında gerçekleştiğinde, oyuncu tuşa bastığı sırada havadadır ve basış boşa gider. Oyuncu, oyunun kendisini görmezden geldiğini hisseder.
Zıplama tamponu, basışı birkaç kare boyunca hatırlar. Olay yalnızca bir zamanlayıcı başlatır:
elif event.type == pygame.KEYDOWN and event.key in (pygame.K_SPACE, pygame.K_UP):
jump_timer = JUMP_BUFFERHer karede, yer çekiminden önce, zamanlayıcı hâlâ çalışıyorsa ve oyuncu yerdeyse zıplayın; ardından zamanlayıcıyı geri sayın:
if jump_timer > 0 and on_ground:
vel_y = JUMP
jump_timer = 0
if jump_timer > 0:
jump_timer -= 1JUMP_BUFFER = 6 ile bir basış 6 kare boyunca geçerli sayılır; bu, saniyenin onda biridir: erken bir basışı yakalayacak kadar uzun, inişten çok önce yapılan bir basışın beklenmedik biçimde zıplatmayacağı kadar kısadır. Yerdeyken yapılan bir basış yine de sonraki karede zıplamayı sağlar.
Görev
Zor- Üste
JUMP_BUFFER = 6ve döngüden öncejump_timer = 0ekle. - Boşluk veya Yukarı tuşuna basıldığında (
KEYDOWN), zıplamak yerinejump_timer = JUMP_BUFFERayarla. - Her karede, yer çekiminden önce:
jump_timer > 0veon_groundolduğundavel_y = JUMPvejump_timer = 0ayarla. Ardından,jump_timer > 0ise değerini 1 azalt.
Kendin dene
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()
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Dünyalar bölümündeki tüm dersler
1Metinden Haritalar
Metinde Bir SeviyeSatırlar ve SütunlarAnlam Taşıyan HarflerOyuncunun Başladığı YerHer Seferinde Bir Ekran3Yerçekimi ve Zıplama
Yerçekimiyle DüşmeYerden ZıplamaKısa SıçrayışlarEn Yüksek Düşme HızıZıplama Tamponu6Devriye Gezen Düşmanlar
Devriye Gezen Bir BlobÜzerine Bas ya da Darbe AlYürüme DöngüsüHaritadaki DüşmanlarKendi başına pratik yap: Pygame playground