נחיתה על פלטפורמות
חלק מהיחידה עולמות במסלול ה-Pygame של Coddy. שיעור 16 מתוך 35.
עכשיו נגרום לקירות להחזיק את השחקן. אחרי שתנועת הצד תוקנה, נזיז לאורך ציר y ונתקן את התנועה באותו אופן: אם השחקן חופף לקיר בזמן נפילה, נציב את רגליו על החלק העליון של הקיר.
vel_y = min(vel_y + GRAVITY, MAX_FALL)
player.y += vel_y
on_ground = False
for wall in walls:
if player.colliderect(wall):
if vel_y > 0:
player.bottom = wall.top
vel_y = 0
on_ground = Trueon_ground מתחיל כל פריים בתור False, ורק נחיתה הופכת אותו ל-True. צעדו מעבר לקצה, ובפריים הבא לא יימצא דבר מתחת לשחקן, לכן הוא ייפול ולא יוכל לקפוץ באוויר.
זה מחליף את שורת FLOOR: השורה התחתונה של המפה היא קרקע, כמו כל קיר אחר. כוח הכבידה מושך את השחקן פיקסל אחד לתוך הקרקע בכל פריים, ובדיקת הנחיתה מרימה אותו בחזרה, כך שהוא נשאר במקום.
אתגר
בינוני- הסר את בדיקת השורה של
FLOOR. - אחרי
player.y += vel_y, הגדרon_ground = False, ואז עבור בלולאה עלwalls. - עבור כל קיר שהשחקן מתנגש בו כאשר
vel_y > 0:player.bottom = wall.top,vel_y = 0,on_ground = True.
נסו בעצמכם
import pygame
TILE = 36
SPEED = 4
GRAVITY = 1
JUMP = -15
MAX_FALL = 12
FLOOR = 324
LEVEL = [
"................",
"................",
"................",
"....P.....###...",
"................",
"................",
"...####.........",
"............#...",
"#.......#...#..#",
"################",
]
pygame.init()
screen = pygame.display.set_mode((576, 360))
pygame.display.set_caption("Landing")
clock = pygame.time.Clock()
background = pygame.image.load("assets/backgrounds/clouds.png").convert_alpha()
block_img = pygame.image.load("assets/images/block.png").convert_alpha()
player_img = pygame.image.load("assets/images/player.png").convert_alpha()
walls = []
for row, line in enumerate(LEVEL):
for col, char in enumerate(line):
if char == "#":
walls.append(pygame.Rect(col * TILE, row * TILE, TILE, TILE))
elif char == "P":
start = (col * TILE + TILE // 2, row * TILE + TILE)
player = player_img.get_rect(midbottom=start)
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()
dx = 0
if keys[pygame.K_LEFT]:
dx -= SPEED
if keys[pygame.K_RIGHT]:
dx += SPEED
player.x += dx
for wall in walls:
if player.colliderect(wall):
if dx > 0:
player.right = wall.left
elif dx < 0:
player.left = wall.right
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 wall in walls:
screen.blit(block_img, wall)
screen.blit(player_img, player)
pygame.display.flip()
clock.tick(60)
pygame.quit()
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה עולמות
תרגלו בעצמכם: Pygame אונליין