Bir Hedefe Doğru İlerle
Coddy'nin Pygame Journey'sinin Ses ve Oyun Hissi bölümünün bir parçası. Ders 16 / 23.
Tıkla, daire oraya ışınlanır. Yerine kayarak oturan bir şey daha iyi görünür: önce hızlı, sonra yavaşlar ve hedefine nazikçe yerleşir. Bunu tek bir satır yapar. Her karede, geriye kalan mesafenin bir kısmı kadar ilerle:
x += (target_x - x) * 0.1
y += (target_y - y) * 0.1target_x - x, geriye ne kadar yol kaldığını gösterir. Bunun onda biri kadar ilerlemek, ilk karede 200 piksellik bir yolun 20 pikselini kat eder. Sonraki karede geriye 180 piksel kalır, bu yüzden 18 piksel ilerler; sonra 16.2 piksel ve böyle devam eder. Daire yaklaştıkça adımlar küçülür: aniden durmak yerine yumuşakça yavaşlar.
Buna genellikle doğrusal enterpolasyonun kısaltması olan lerp denir. Oran, hareketin hissini belirler: 0.1 yumuşak, 0.3 atik, 0.02 ise yavaş ve süzülür gibidir. Hedefe hiçbir zaman tam olarak ulaşmaz, ancak bir saniye sonra bir pikselden daha yakın olur; bunu kimse fark edemez.
x ve y değerlerini kendi değişkenlerinde ondalıklı sayılar olarak tut. Rect tam sayılar saklar; bu nedenle 0.4 piksellik bir adım 0'a yuvarlanır ve hareket hedefe ulaşamadan durur.
Görev
KolayDaire her tıklamada hedefe atlar. Kaymasını sağla: x = target_x ve y = target_y ifadelerini, her karede x ve y değerlerini hedefe doğru yolun onda biri kadar ilerleten satırlarla değiştir.
Kendin dene
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()
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