תאוצה וחיכוך
חלק מהיחידה לולאת המשחק במסלול ה-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 פיקסלים לשנייה.
אתגר
בינוני- בלולאה, החלף את
vel = pygame.Vector2(0, 0)ב-acc = pygame.Vector2(0, 0), והגדר בכל אחד ממקשי החצים אתacc.xאו אתacc.yל-600או ל--600. - לפני הזזת הדסקית, הוסף ל-
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 אונליין