Menu
CoddyTech

Akıcı Bir Kamera

Coddy'nin Pygame Journey'sinin Ses ve Oyun Hissi bölümünün bir parçası. Ders 17 / 23.

Bu yol oyununda kamera oyuncuya sabitlenmiştir: oyuncu ne yaparsa yapsın ekranın merkezinde kalır ve dünya onun altında kayar. İşe yarar ama her kalkış ve duruş tüm görüntünün sarsılmasına neden olur.

Kameranın, daireyle aynı yumuşak geçişi kullanarak oyuncuyu takip etmesini sağlayın. Hedefi, oyuncuyu ortalayacak konumdur:

camera_x += (player.centerx - 240 - camera_x) * 0.1
camera_x = max(0, min(camera_x, WORLD_WIDTH - 480))

Oyuncu eskisi gibi hareket eder; yalnızca görüntü yumuşak geçiş yapar. Oyuncu koşmaya başladığında kamera biraz geride kalır, böylece oyuncu merkezin önüne geçer. Durduğunda kamera yetişmek için süzülür ve oyuncu yeniden ortadayken durulur. İkinci satır kamerayı hâlâ dünyanın sınırları içinde tutar.

Dünya, eskisi gibi -int(camera_x) konumunda çizilir. camera_x artık ondalıklı bir sayıdır; int() çizimi tam piksellere sabitlerken değişken, sonraki kare için kesin değerini korur.

İçeri kayan bir menü paneli, azalan bir can çubuğu, artan bir skor: yeni bir değere hareket eden her şey aynı şekilde yumuşak geçiş yapabilir.

challenge icon

Görev

Orta

Kameranın akıcı bir şekilde takip etmesini sağla: camera_x = player.centerx - 240 satırını, her karede camera_x değerini player.centerx - 240 değerine doğru onda bir oranında ilerleten bir satırla değiştir. Sınırlandıran satırı koru.

Kendin dene

import pygame

pygame.init()
screen = pygame.display.set_mode((480, 360))
pygame.display.set_caption("Long Road")
clock = pygame.time.Clock()

WORLD_WIDTH = 1440
player = pygame.Rect(220, 240, 40, 40)
camera_x = 0

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT]:
        player.x -= 6
    if keys[pygame.K_RIGHT]:
        player.x += 6
    player.left = max(player.left, 0)
    player.right = min(player.right, WORLD_WIDTH)

    camera_x = player.centerx - 240
    camera_x = max(0, min(camera_x, WORLD_WIDTH - 480))

    screen.fill((30, 30, 46))
    pygame.draw.rect(screen, (80, 80, 100), (0, 280, 480, 80))
    for post_x in range(0, WORLD_WIDTH, 120):
        pygame.draw.rect(screen, (80, 160, 255), (post_x - int(camera_x), 220, 20, 60))
    pygame.draw.rect(screen, (90, 200, 120), player.move(-int(camera_x), 0))
    pygame.display.flip()
    clock.tick(60)

pygame.quit()
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Ses ve Oyun Hissi bölümündeki tüm dersler

Kendi başına pratik yap: Pygame playground