Zdepcz albo daj się trafić
Część sekcji Światy ścieżki Pygame w Coddy. Lekcja 25 z 35.
Dotknięcie blobu powinno mieć znaczenie na dwa sposoby. Wyląduj na nim, a blob zostanie pokonany. Wpadnij na niego, a gracz odniesie obrażenia.
Różnica zależy od tego, jak gracz się tam dostał. Nadleciał z góry, jeśli spada, vel_y > 0, a jego stopy wciąż znajdują się powyżej środka blobu:
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 = 0blob.kill() usuwa duszka z grupy, więc nie jest on już aktualizowany ani rysowany. vel_y = -8 powoduje niewielkie odbicie, które informuje gracza, że uderzenie stopami zadziałało, i pozwala mu wykonać kolejny skok. Każde inne zderzenie następuje z boku lub od dołu, a gracz wraca na początek, tak jak po upadku.
Przejdź pętlą przez grupę, aby sprawdzić każdego bloba. Wywołanie kill() wewnątrz pętli jest tu bezpieczne, ponieważ pętla przechodzi przez duszki należące do grupy w chwili jej rozpoczęcia.
Wyzwanie
Średni- Gdy blob-y się poruszą, wykonaj pętlę po
blobs. - Gdy gracz zderzy się z obiektem Rect bloba: jeśli
vel_y > 0iplayer.bottom < blob.rect.centery, wywołajblob.kill()i ustawvel_y = -8. - W przeciwnym razie ustaw
player.midbottom = startivel_y = 0.
Spróbuj swoich sił
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("Stomp")
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()
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 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()
Wszystkie lekcje w sekcji Światy
1Mapy z tekstu
Poziom w tekścieWiersze i kolumnyLitery ze znaczeniemGdzie zaczyna graczJeden ekran narazPoćwicz samodzielnie: Edytor online Pygame