Un ciclo di camminata
Fa parte della sezione Mondi del percorso Pygame di Coddy. Lezione 26 di 35.
Un blob che scivola con una sola immagine sembra congelato. Il pacchetto contiene una seconda posa, blob_walk.png, con i piedi in un'altra posizione. Mostrandole a turno, il blob cammina.
Tieni entrambe le pose in una lista e un contatore dei fotogrammi nello sprite. A ogni aggiornamento, incrementa il contatore e scegli una posa in base al suo valore:
self.frames = [blob_img, blob_walk_img]
self.timer = 0
# in update
self.timer += 1
self.image = self.frames[self.timer // 10 % 2]self.timer // 10 aumenta di uno ogni 10 fotogrammi e % 2 lo trasforma in 0, 1, 0, 1. Ogni posa viene mostrata per 10 fotogrammi, sei passi al secondo. Un numero inferiore a 10 fa muovere i piedi più velocemente.
Il ciclo di disegno esegue già il blit di blob.image, quindi basta cambiare self.image.
Sfida
Facile- In
Blob.__init__, impostaself.frames = [blob_img, blob_walk_img]eself.timer = 0(blob_walk_imgviene caricato nel codice iniziale). - All'inizio di
update, aggiungi 1 aself.timere impostaself.image = self.frames[self.timer // 10 % 2].
Provalo tu
import pygame
TILE = 36
SPEED = 4
GRAVITY = 1
JUMP = -15
MAX_FALL = 12
LEVEL = [
"................",
"................",
"................",
"................",
"..........####..",
"................",
"...####.........",
"................",
"#.P............#",
"################",
]
pygame.init()
screen = pygame.display.set_mode((576, 360))
pygame.display.set_caption("Walk Cycle")
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()
blob_img = pygame.image.load("assets/images/blob.png").convert_alpha()
blob_walk_img = pygame.image.load("assets/images/blob_walk.png").convert_alpha()
class Blob(pygame.sprite.Sprite):
def __init__(self, midbottom):
super().__init__()
self.image = blob_img
self.rect = pygame.Rect(0, 0, 30, 26)
self.rect.midbottom = midbottom
self.direction = 1
def update(self):
self.rect.x += self.direction
if self.direction > 0:
ahead = self.rect.right
else:
ahead = self.rect.left - 1
hit_wall = any(self.rect.colliderect(wall) for wall in walls)
ground_ahead = any(wall.collidepoint(ahead, self.rect.bottom) for wall in walls)
if hit_wall or not ground_ahead:
self.rect.x -= self.direction
self.direction = -self.direction
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)
blobs = pygame.sprite.Group(Blob((432, 144)), Blob((432, 324)))
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
for wall in walls:
if player.colliderect(wall):
if vel_y > 0:
player.bottom = wall.top
on_ground = True
elif vel_y < 0:
player.top = wall.bottom
vel_y = 0
blobs.update()
for blob in blobs:
if player.colliderect(blob.rect):
if vel_y > 0 and player.bottom < blob.rect.centery:
blob.kill()
vel_y = -8
else:
player.midbottom = start
vel_y = 0
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)
for blob in blobs:
screen.blit(blob.image, blob.image.get_rect(midbottom=blob.rect.midbottom))
screen.blit(player_img, player)
pygame.display.flip()
clock.tick(60)
pygame.quit()
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
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'internoParallasse3Gravità e salto
Cadere con la gravitàSaltare da terraSaltelli breviUna velocità massima di cadutaBuffer del salto6Nemici in pattuglia
Un blob in pattugliaSchiaccialo o verrai colpitoUn ciclo di camminataNemici dalla mappaEsercitati da solo: Playground Pygame