Menu
CoddyTech

تخزين القفز مؤقتًا

جزء من قسم العوالم في رحلة Pygame على Coddy. الدرس 14 من 35.

يضغط اللاعبون على زر القفز عندما يرون أن الهبوط وشيك، وغالبًا قبل ذلك ببضعة إطارات. عند تنفيذ القفز داخل حدث KEYDOWN، يجد هذا الضغط اللاعب في الهواء ويُهمل. ويشعر اللاعب بأن اللعبة تجاهلته.

يحتفظ مخزن القفز بالضغط لبضعة إطارات. ولا يبدأ الحدث سوى مؤقّت:

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

في كل إطار، وقبل تطبيق الجاذبية، اقفز إذا كان المؤقّت لا يزال يعمل واللاعب على الأرض، وأنقص قيمة المؤقّت:

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

عندما تكون قيمة JUMP_BUFFER = 6، يُحتسب الضغط لمدة 6 إطارات، أي عُشر ثانية: مدة تكفي لاحتساب ضغطة مبكرة، وقصيرة بما يكفي كي لا يؤدي ضغط حدث قبل الهبوط بوقت طويل إلى قفزة مفاجئة. أما الضغط أثناء الوقوف على الأرض، فيؤدي إلى القفز في الإطار التالي.

challenge icon

التحدي

صعب
  1. أضف JUMP_BUFFER = 6 في الأعلى، وjump_timer = 0 قبل الحلقة.
  2. عند الضغط على مفتاح المسافة أو السهم للأعلى، اضبط jump_timer = JUMP_BUFFER بدلًا من القفز.
  3. في كل إطار، قبل تطبيق الجاذبية: عندما يكون jump_timer > 0 وon_ground، اضبط vel_y = JUMP وjump_timer = 0. ثم، إذا كان jump_timer > 0، أنقصه بمقدار 1.

جرّب بنفسك

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 iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس العوالم

تدرّب بنفسك: Playground لـ Pygame