Bergerak Menuju Target
Termasuk bagian Suara dan Sensasi Bermain dalam perjalanan Pygame di Coddy. Pelajaran 16 dari 23.
Lingkaran langsung berpindah ke sana saat kamu mengeklik. Benda yang meluncur ke tempatnya terlihat lebih bagus: awalnya cepat, lalu melambat, dan perlahan berhenti di posisinya. Satu baris kode bisa melakukannya. Setiap frame, gerakkan benda sejauh sebagian kecil dari jarak yang tersisa:
x += (target_x - x) * 0.1
y += (target_y - y) * 0.1target_x - x menunjukkan jarak yang masih harus ditempuh. Dengan menempuh sepersepuluh jarak itu, lingkaran bergerak 20 piksel dari perjalanan sejauh 200 piksel pada frame pertama. Pada frame berikutnya, jarak yang tersisa 180 piksel, jadi lingkaran bergerak 18 piksel, lalu 16.2, dan seterusnya. Langkahnya makin kecil saat lingkaran mendekat: gerakannya melambat secara bertahap, bukan berhenti mendadak.
Teknik ini sering disebut lerp, singkatan dari interpolasi linear. Nilai pecahannya menentukan nuansa gerakan: 0.1 menghasilkan gerakan yang mulus, 0.3 terasa cepat, sedangkan 0.02 terasa lambat dan melayang. Lingkaran tidak pernah tepat mencapai target, tetapi setelah satu detik jaraknya kurang dari satu piksel, sehingga tidak terlihat oleh siapa pun.
Simpan x dan y sebagai angka desimal dalam variabelnya masing-masing. Rect menyimpan bilangan bulat, jadi langkah sebesar 0.4 piksel akan dibulatkan menjadi 0 dan gerakan akan terhenti sebelum mencapai target.
Tantangan
MudahLingkaran langsung berpindah ke setiap titik yang kamu klik. Buat lingkaran meluncur: ganti x = target_x dan y = target_y dengan baris kode yang menggerakkan x dan y sepersepuluh jarak menuju target di setiap frame.
Coba sendiri
import pygame
pygame.init()
screen = pygame.display.set_mode((480, 360))
pygame.display.set_caption("Follow the Click")
clock = pygame.time.Clock()
x, y = 240, 180
target_x, target_y = 240, 180
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.MOUSEBUTTONDOWN:
target_x, target_y = event.pos
x = target_x
y = target_y
screen.fill((30, 30, 46))
pygame.draw.line(screen, (90, 90, 110), (target_x - 8, target_y), (target_x + 8, target_y), 2)
pygame.draw.line(screen, (90, 90, 110), (target_x, target_y - 8), (target_x, target_y + 8), 2)
pygame.draw.circle(screen, (80, 200, 220), (x, y), 12)
pygame.display.flip()
clock.tick(60)
pygame.quit()
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