Menu
CoddyTech

נחיתה על פלטפורמות

חלק מהיחידה עולמות במסלול ה-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 = True

on_ground מתחיל כל פריים בתור False, ורק נחיתה הופכת אותו ל-True. צעדו מעבר לקצה, ובפריים הבא לא יימצא דבר מתחת לשחקן, לכן הוא ייפול ולא יוכל לקפוץ באוויר.

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

challenge icon

אתגר

בינוני
  1. הסר את בדיקת השורה של FLOOR.
  2. אחרי player.y += vel_y, הגדר on_ground = False, ואז עבור בלולאה על walls.
  3. עבור כל קיר שהשחקן מתנגש בו כאשר 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()
quiz iconבחנו את עצמכם

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

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

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