Menu
CoddyTech

מהירות נפילה מרבית

חלק מהיחידה עולמות במסלול ה-Pygame של Coddy. שיעור 13 מתוך 35.

כוח הכבידה ממשיך להוסיף למהירות הנפילה. אם נופלים מגובה מספיק, השחקן נע 30 או 40 פיקסלים בפריים אחד. גובהו של אריח הוא 36 פיקסלים, ולכן במהירות הזאת השחקן עלול לעבור ישר דרך משטח בין שני פריימים, בלי לחפוף אליו אפילו פעם אחת.

גם לנפילות אמיתיות יש מהירות מרבית. הגבילו את המהירות באמצעות min:

MAX_FALL = 12
# בתוך הלולאה
vel_y = min(vel_y + GRAVITY, MAX_FALL)

min מחזירה את הקטן מבין שני המספרים, ולכן המהירות גדלה ב-1 בכל פריים עד שהיא מגיעה ל-12 ואז נשארת שם. קפיצה מתחילה ב-15-, מתחת לתקרה, ולכן הקפיצות לא משתנות.

12 הם שליש מאריח: לא משנה על מה השחקן נוחת, באחד הפריימים תהיה חפיפה, ובדיקת הנחיתה תוכל לזהות אותה.

challenge icon

אתגר

קל
  1. הוסף MAX_FALL = 12 בראש.
  2. החלף את vel_y += GRAVITY ב-vel_y = min(vel_y + GRAVITY, MAX_FALL).

השחקן מתחיל באוויר, כך שתוכל לראות אותו מגיע למהירות המרבית.

נסו בעצמכם

import pygame

TILE = 36
FLOOR = 324
GRAVITY = 1
JUMP = -15

pygame.init()
screen = pygame.display.set_mode((576, 360))
pygame.display.set_caption("Falling Speed")
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 += GRAVITY
    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()

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

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