Sağ ve Sol Duvarlar
Coddy'nin Pygame Journey'sinin Dünyalar bölümünün bir parçası. Ders 15 / 35.
Bloklar çiziliyor, ancak oyuncu içlerinden geçiyor. Bir duvar oyuncuyu durdurmalı. Önce hareket ettir, sonra hareketi düzelt: oyuncu artık bir duvarla çakışıyorsa, geldiği taraftan dışarı it.
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 bu karedeki yatay harekettir: pozitif değer sağa hareket anlamına gelir. Sağa hareket ederken oyuncu duvarın sol tarafına çarpar, bu yüzden sağ kenarı o noktaya gelir. Sola hareket ederken sol kenarı duvarın sağ kenarına gelir.
Harita, Maps from Text'tekiyle aynı şekilde, Rect'lerden oluşan bir liste olan walls içine oluşturulur. Zemin hâlâ FLOOR çizgisidir ve oyuncu hâlâ bir bloğun üstüne düşebilir: duvarlara iniş bir sonraki adımda ele alınacak.
Görev
Ortaplayer.x += dxsatırından sonrawallsüzerinde döngü oluştur.- Oyuncunun çarpıştığı her duvar için:
dx > 0olduğundaplayer.right = wall.leftolarak ayarla;dx < 0olduğundaplayer.left = wall.rightolarak ayarla.
Kendin dene
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()
Dünyalar bölümündeki tüm dersler
1Metinden Haritalar
Metinde Bir SeviyeSatırlar ve SütunlarAnlam Taşıyan HarflerOyuncunun Başladığı YerHer Seferinde Bir Ekran4Platform Çarpışmaları
Sağ ve Sol DuvarlarPlatformlara İnişBaşını ÇarpSeviyenin Dışına DüşmekHer Seferinde Tek Eksen3Yerçekimi ve Zıplama
Yerçekimiyle DüşmeYerden ZıplamaKısa SıçrayışlarEn Yüksek Düşme HızıZıplama Tamponu6Devriye Gezen Düşmanlar
Devriye Gezen Bir BlobÜzerine Bas ya da Darbe AlYürüme DöngüsüHaritadaki DüşmanlarKendi başına pratik yap: Pygame playground