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. בעת KEYDOWN של מקש הרווח או החץ למעלה, הגדירו את 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בחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה עולמות

תרגלו בעצמכם: Pygame אונליין