Menu
CoddyTech

İvme ve Sürtünme

Coddy'nin Pygame Journey'sinin Oyun Döngüsü bölümünün bir parçası. Ders 21 / 32.

Disk tam hızda başlar ve tuşu bıraktığında aniden durur. Buzda hızlanmalı ve kaymalıdır. Bunu iki değişiklik sağlar.

İvme, hızın her saniye, saniyede kaç piksel değiştiğidir. Tuşlar ivmeyi belirler ve ivme hızı değiştirir:

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

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

acc'yi her karede yeniden oluştur; böylece hiçbir tuşa basılmadığında sıfır olur. Hız kareler arasında değerini korur, bu nedenle disk kaymaya devam eder.

Sürtünme ikinci satırdır. vel * 2 * dt, hızın küçük bir kısmıdır ve disk hızlıyken daha büyüktür. Her karede bu miktarı çıkarmak, hızlı diski çabucak, yavaş diskiyse yavaşça durana kadar yavaşlatır. 2'den büyük bir sayı, daha pürüzlü bir zemin demektir.

Yeterince uzun süre basılı tutulduğunda, itme ve sürtünme 600 / 2 = 300 piksel/saniye azami hızında dengelenir.

challenge icon

Görev

Orta
  1. Döngüde, vel = pygame.Vector2(0, 0) ifadesini acc = pygame.Vector2(0, 0) ile değiştir ve her ok tuşunun acc.x veya acc.y değerini 600 ya da -600 yapmasını sağla.
  2. Puku hareket ettirmeden önce acc * dt değerini vel değerine ekle, ardından vel * 2 * dt değerini ondan çıkar.

Kendin dene

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

Oyun Döngüsü bölümündeki tüm dersler

Kendi başına pratik yap: Pygame playground