Menu
CoddyTech

Paralaks

Coddy'nin Pygame Journey'sinin Dünyalar bölümünün bir parçası. Ders 23 / 35.

Hareket hâlindeki bir trenden dışarı bak: çit hızla yanından geçerken uzaktaki tepeler neredeyse hiç kıpırdamaz. Uzak şeyleri yakındakilerden daha yavaş çizmek, düz bir oyuna derinlik hissi verir. Buna paralaks denir.

Bulut arka planını kameranın hareketinin üçte biri kadar kaydırarak çiz. Her 72 pikselde bir tekrarlandığı için yalnızca camera_x // 3 % 72 önemlidir: bir görselin tamamı kadar kaydığında aynı görünür.

shift = camera_x // 3 % 72
for y in range(0, 360, 72):
    for x in range(-shift, WIDTH, 72):
        screen.blit(background, (x, y))

x döngüsü pencerenin solunda, -shift noktasından başlar; böylece ilk kopya kayıp dışarı çıkarken sol kenarı kaplar. Döşemeler ve oyuncu hâlâ camera_x değerinin tamamını kullanır: onlar yakındadır.

challenge icon

Görev

Orta
  1. screen.fill yerine, başlangıç kodunda yüklenen background görselini 72 piksellik bir ızgaraya göre çiz.
  2. Her karede shift = camera_x // 3 % 72 değerini ayarla ve kopyaların her satırına x = -shift konumundan başlayarak, WIDTH değerine kadar 72'şer piksel ilerle.
  3. Daha önce olduğu gibi, arka planın ardından döşemeleri ve oyuncuyu çiz.

Kendin dene

import pygame

TILE = 36
WIDTH = 576
SPEED = 4
GRAVITY = 1
JUMP = -15
MAX_FALL = 12

LEVEL = [
    "................................................",
    "................................................",
    "#...........###..........####..........###.....#",
    "#..............................................#",
    "#.....####.........###.........###.............#",
    "#..............................................#",
    "#.P........#####.........######.........####...#",
    "#..............................................#",
    "#..............................................#",
    "################################################",
]

pygame.init()
screen = pygame.display.set_mode((WIDTH, 360))
pygame.display.set_caption("Parallax")
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)

level_width = len(LEVEL[0]) * TILE
player = player_img.get_rect(midbottom=start)
vel_y = 0
on_ground = False
camera_x = 0

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

    camera_x = player.centerx - WIDTH // 2
    camera_x = max(0, min(camera_x, level_width - WIDTH))

    screen.fill((140, 200, 240))
    for wall in walls:
        screen.blit(block_img, (wall.x - camera_x, wall.y))
    screen.blit(player_img, (player.x - camera_x, player.y))
    pygame.display.flip()
    clock.tick(60)

pygame.quit()

Dünyalar bölümündeki tüm dersler

Kendi başına pratik yap: Pygame playground