Kamera yang Halus
Termasuk bagian Suara dan Sensasi Bermain dalam perjalanan Pygame di Coddy. Pelajaran 17 dari 23.
Kamera dalam game jalanan ini terpaku pada pemain: apa pun yang dilakukan pemain, pemain tetap berada di tengah layar dan dunia bergeser di bawahnya. Cara ini berfungsi, tetapi setiap kali mulai dan berhenti, seluruh tampilan tersentak.
Buat kamera mengikuti dengan easing yang sama seperti lingkaran. Targetnya adalah posisi yang akan menempatkan pemain di tengah:
camera_x += (player.centerx - 240 - camera_x) * 0.1
camera_x = max(0, min(camera_x, WORLD_WIDTH - 480))Pemain bergerak seperti sebelumnya, hanya tampilannya yang bergerak dengan easing. Saat pemain mulai berlari, kamera sedikit tertinggal, sehingga pemain berlari melewati bagian tengah. Saat pemain berhenti, kamera meluncur untuk menyusul dan akhirnya kembali menempatkan pemain di tengah. Baris kedua tetap menjaga kamera berada di dalam dunia.
Dunia digambar pada -int(camera_x) seperti sebelumnya. Sekarang camera_x adalah angka desimal; int() menjaga gambar tetap pada piksel utuh, sementara variabelnya menyimpan nilai persis untuk frame berikutnya.
Panel menu yang meluncur masuk, bilah kesehatan yang terkuras, skor yang terus bertambah: apa pun yang bergerak menuju nilai baru dapat menggunakan easing dengan cara yang sama.
Tantangan
SedangBuat kamera mengikuti dengan mulus: ganti camera_x = player.centerx - 240 dengan baris yang menggerakkan camera_x sepersepuluh jarak menuju player.centerx - 240 pada setiap frame. Pertahankan baris yang membatasinya.
Coba sendiri
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()
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Suara dan Sensasi Bermain
4Guncangan Layar dan Kilatan Saat Terkena Serangan
Guncangan LayarKilatan Saat Terkena SeranganJeda BenturanJangan Berlebihan5Gerakan Halus
Bergerak Menuju TargetKamera yang HalusEfek Pop saat DiambilGerakan Halus pada Frame Rate Apa PunLatihan sendiri: Playground Pygame