מהירות נפילה מרבית
חלק מהיחידה עולמות במסלול ה-Pygame של Coddy. שיעור 13 מתוך 35.
כוח הכבידה ממשיך להוסיף למהירות הנפילה. אם נופלים מגובה מספיק, השחקן נע 30 או 40 פיקסלים בפריים אחד. גובהו של אריח הוא 36 פיקסלים, ולכן במהירות הזאת השחקן עלול לעבור ישר דרך משטח בין שני פריימים, בלי לחפוף אליו אפילו פעם אחת.
גם לנפילות אמיתיות יש מהירות מרבית. הגבילו את המהירות באמצעות min:
MAX_FALL = 12
# בתוך הלולאה
vel_y = min(vel_y + GRAVITY, MAX_FALL)min מחזירה את הקטן מבין שני המספרים, ולכן המהירות גדלה ב-1 בכל פריים עד שהיא מגיעה ל-12 ואז נשארת שם. קפיצה מתחילה ב-15-, מתחת לתקרה, ולכן הקפיצות לא משתנות.
12 הם שליש מאריח: לא משנה על מה השחקן נוחת, באחד הפריימים תהיה חפיפה, ובדיקת הנחיתה תוכל לזהות אותה.
אתגר
קל- הוסף
MAX_FALL = 12בראש. - החלף את
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 אונליין