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.
Görev
OrtaKameranı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()
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
4Ekran Sarsıntısı ve Darbe Parlaması
Ekran SarsıntısıDarbe ParlamasıDarbe DurdurmasıAbartıdan Kaçının6Yıldız Devriyesini Geliştir
Yıldız Devriyesi SesleriHer Vuruşta KıvılcımlarKendi başına pratik yap: Pygame playground