Menu
CoddyTech

Muri a sinistra e a destra

Fa parte della sezione Mondi del percorso Pygame di Coddy. Lezione 15 di 35.

I blocchi vengono disegnati, ma il giocatore li attraversa. Un muro deve fermare il giocatore. Muovilo prima, poi correggi il movimento: se ora il giocatore si sovrappone a un muro, spingilo fuori dal lato da cui è arrivato.

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 è il movimento laterale di questo fotogramma: positivo verso destra. Muovendosi verso destra, il giocatore colpisce il lato sinistro del muro, quindi il suo bordo destro arriva lì. Muovendosi verso sinistra, il suo bordo sinistro arriva al lato destro del muro.

La mappa è inclusa in walls, una lista di Rect, proprio come in Mappe da testo. Il pavimento è ancora la linea in corrispondenza di FLOOR, e il giocatore può ancora cadere sulla parte superiore di un blocco: l'atterraggio sui muri verrà dopo.

challenge icon

Sfida

Medio
  1. Dopo player.x += dx, esegui un ciclo su walls.
  2. Per ogni muro con cui il giocatore collide: quando dx > 0, imposta player.right = wall.left; quando dx < 0, imposta player.left = wall.right.

Provalo tu

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

Tutte le lezioni di Mondi

Esercitati da solo: Playground Pygame