Menu
CoddyTech

קירות משמאל ומימין

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

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

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

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

המפה מובנית בתוך walls, רשימה של Rects, באותו אופן כמו ב"מפות מטקסט". הרצפה עדיין נמצאת בקו שב־FLOOR, והשחקן עדיין יכול ליפול על החלק העליון של בלוק: בשיעור הבא נלמד לנחות על קירות.

challenge icon

אתגר

בינוני
  1. אחרי player.x += dx, עבור בלולאה על walls.
  2. עבור כל קיר שהשחקן מתנגש בו: כאשר dx > 0, הגדר את player.right = wall.left; כאשר dx < 0, הגדר את player.left = wall.right.

נסו בעצמכם

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("Walls")
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

    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 אונליין