تخزين القفز مؤقتًا
جزء من قسم العوالم في رحلة 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 إطارات، أي عُشر ثانية: مدة تكفي لاحتساب ضغطة مبكرة، وقصيرة بما يكفي كي لا يؤدي ضغط حدث قبل الهبوط بوقت طويل إلى قفزة مفاجئة. أما الضغط أثناء الوقوف على الأرض، فيؤدي إلى القفز في الإطار التالي.
التحدي
صعب- أضف
JUMP_BUFFER = 6في الأعلى، وjump_timer = 0قبل الحلقة. - عند الضغط على مفتاح المسافة أو السهم للأعلى، اضبط
jump_timer = JUMP_BUFFERبدلًا من القفز. - في كل إطار، قبل تطبيق الجاذبية: عندما يكون
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()
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس العوالم
تدرّب بنفسك: Playground لـ Pygame