Menu
CoddyTech

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_BUFFER

Her 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 -= 1

JUMP_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.

challenge icon

Görev

Zor
  1. Üste JUMP_BUFFER = 6 ve döngüden önce jump_timer = 0 ekle.
  2. Boşluk veya Yukarı tuşuna basıldığında (KEYDOWN), zıplamak yerine jump_timer = JUMP_BUFFER ayarla.
  3. Her karede, yer çekiminden önce: jump_timer > 0 ve on_ground olduğunda vel_y = JUMP ve jump_timer = 0 ayarla. Ardından, jump_timer > 0 ise 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()
quiz iconKendini test et

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

Kendi başına pratik yap: Pygame playground