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.rightdx è 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.
Sfida
Medio- Dopo
player.x += dx, esegui un ciclo suwalls. - Per ogni muro con cui il giocatore collide: quando
dx > 0, impostaplayer.right = wall.left; quandodx < 0, impostaplayer.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
1Mappe dal testo
Un livello in testoRighe e colonneLettere con significatoDove inizia il giocatoreUna schermata alla volta4Collisioni con le piattaforme
Muri a sinistra e a destraAtterrare sulle piattaformeBattere la testaCadere fuori dal livelloUn asse alla volta5Una telecamera a scorrimento
Un offset della telecameraSegui il giocatoreMantieni la telecamera all'internoParallasseEsercitati da solo: Playground Pygame