Menu
CoddyTech

التحرك نحو هدف

جزء من قسم الصوت وإحساس اللعب في رحلة Pygame على Coddy. الدرس 16 من 23.

انقر، فتنتقل الدائرة آنيًا إلى هناك. يبدو الشيء الذي ينزلق إلى مكانه أفضل: سريعًا في البداية، ثم أبطأ، ليستقر برفق في موضعه. يحقق سطر واحد ذلك. في كل إطار، تحرّك جزءًا من المسافة المتبقية:

x += (target_x - x) * 0.1
y += (target_y - y) * 0.1

يمثّل target_x - x المسافة المتبقية. إن تحريك عُشرها يقطع 20 بكسلًا من رحلة طولها 200 بكسل في الإطار الأول. في الإطار التالي، يتبقى 180 بكسلًا، لذا تتحرك 18، ثم 16.2، وهكذا. تتقلص الخطوات كلما اقتربت الدائرة: فهي تتباطأ تدريجيًا بدلًا من أن تتوقف فجأة.

يُسمّى هذا غالبًا lerp، اختصارًا للاستيفاء الخطي. يحدد الكسر الإحساس بالحركة: 0.1 سلس، و0.3 سريع الاستجابة، و0.02 بطيء وخفيف. لا تصل الدائرة إلى الهدف تمامًا، لكن بعد ثانية تصبح على بُعد أقل من بكسل واحد، وهو ما لا يمكن لأحد ملاحظته.

احتفظ بـ x وy كعددين عشريين في متغيرين مستقلين. يخزّن Rect أعدادًا صحيحة، لذا ستُقرَّب خطوة مقدارها 0.4 بكسل إلى 0، وستتوقف الحركة قبل بلوغ هدفها.

challenge icon

التحدي

سهل

تقفز الدائرة إلى كل موضع نقرة. اجعلها تنزلق: استبدل x = target_x وy = target_y بأسطر تحرّك x وy عُشر المسافة نحو الهدف في كل إطار.

جرّب بنفسك

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()

جميع دروس الصوت وإحساس اللعب

تدرّب بنفسك: Playground لـ Pygame