מאגר קפיצה
חלק מהיחידה עולמות במסלול ה-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לפני הלולאה. - בעת
KEYDOWNשל מקש הרווח או החץ למעלה, הגדירו את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()
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה עולמות
תרגלו בעצמכם: Pygame אונליין