Menu
CoddyTech

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.right

dx 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.

challenge icon

Görev

Orta
  1. player.x += dx satırından sonra walls üzerinde döngü oluştur.
  2. Oyuncunun çarpıştığı her duvar için: dx > 0 olduğunda player.right = wall.left olarak ayarla; dx < 0 olduğunda player.left = wall.right olarak 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

Kendi başına pratik yap: Pygame playground