التسارع والاحتكاك
جزء من قسم حلقة اللعبة في رحلة 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. - قبل تحريك القرص، أضف
acc * dtإلىvel، ثم اطرح منه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()
جميع دروس حلقة اللعبة
تدرّب بنفسك: Playground لـ Pygame