Menu
CoddyTech

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.1

target_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.

challenge icon

Görev

Kolay

Daire 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

Kendi başına pratik yap: Pygame playground