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

כל השיעורים ביחידה צליל ותחושת משחק

תרגלו בעצמכם: Pygame אונליין