Menu
CoddyTech

תאוצה וחיכוך

חלק מהיחידה לולאת המשחק במסלול ה-Pygame של Coddy. שיעור 21 מתוך 32.

הדיסקית מתחילה במהירות מלאה ונעצרת בבת אחת כשמשחררים. על הקרח היא אמורה לצבור מהירות ולהחליק. שני שינויים יעשו זאת.

תאוצה היא הקצב שבו המהירות משתנה, בפיקסלים לשנייה, בכל שנייה. המקשים קובעים את התאוצה, והתאוצה משנה את המהירות:

acc = pygame.Vector2(0, 0)
if keys[pygame.K_RIGHT]:
    acc.x = 600

vel += acc * dt
vel -= vel * 2 * dt
pos += vel * dt

אתחלו את acc מחדש בכל פריים, כך שערכו יהיה אפס כשלא מוחזק אף מקש. המהירות שומרת על ערכה מפריים לפריים, ולכן הדיסקית ממשיכה להחליק.

חיכוך הוא השורה השנייה. vel * 2 * dt הוא חלק קטן מהמהירות, והוא גדול יותר כשהדיסקית מהירה. החסרתו בכל פריים מאטה דיסקית מהירה במהירות ודיסקית איטית בעדינות, עד שהיא נעצרת. מספר גדול מ־2 מייצג רצפה מחוספסת יותר.

אם מחזיקים את המקש מספיק זמן, הדחיפה והחיכוך מתאזנים במהירות מרבית של 600 / 2 = 300 פיקסלים לשנייה.

challenge icon

אתגר

בינוני
  1. בלולאה, החלף את vel = pygame.Vector2(0, 0) ב-acc = pygame.Vector2(0, 0), והגדר בכל אחד ממקשי החצים את acc.x או את acc.y ל-600 או ל--600.
  2. לפני הזזת הדסקית, הוסף ל-vel את acc * dt, ואז החסר ממנו את vel * 2 * dt.

נסו בעצמכם

import pygame

pygame.init()
screen = pygame.display.set_mode((480, 360))
pygame.display.set_caption("Ice Puck")
clock = pygame.time.Clock()

pos = pygame.Vector2(240, 180)
vel = pygame.Vector2(0, 0)
dt = 0

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    keys = pygame.key.get_pressed()
    vel = pygame.Vector2(0, 0)
    if keys[pygame.K_LEFT]:
        vel.x = -200
    if keys[pygame.K_RIGHT]:
        vel.x = 200
    if keys[pygame.K_UP]:
        vel.y = -200
    if keys[pygame.K_DOWN]:
        vel.y = 200

    pos += vel * dt
    pos.x = max(14, min(pos.x, 466))
    pos.y = max(14, min(pos.y, 346))

    screen.fill((200, 225, 240))
    pygame.draw.circle(screen, (40, 50, 70), pos, 14)
    pygame.display.flip()
    dt = clock.tick(60) / 1000

pygame.quit()

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

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