Percepatan dan Gesekan
Termasuk bagian Perulangan Game dalam perjalanan Pygame di Coddy. Pelajaran 21 dari 32.
Puck mulai dengan kecepatan penuh dan langsung berhenti saat kamu melepaskannya. Di atas es, puck seharusnya bertambah cepat dan meluncur. Dua perubahan bisa membuatnya begitu.
Akselerasi adalah seberapa cepat kecepatan berubah, dalam piksel per detik, setiap detik. Tombol mengatur akselerasi, dan akselerasi mengubah kecepatan:
acc = pygame.Vector2(0, 0)
if keys[pygame.K_RIGHT]:
acc.x = 600
vel += acc * dt
vel -= vel * 2 * dt
pos += vel * dtBuat acc baru di setiap frame agar nilainya nol saat tidak ada tombol yang ditekan. Kecepatan tetap memiliki nilainya dari satu frame ke frame berikutnya, sehingga puck terus meluncur.
Gesekan ada di baris kedua. vel * 2 * dt adalah sebagian kecil dari kecepatan, dan nilainya lebih besar saat puck bergerak cepat. Menguranginya setiap frame akan memperlambat puck yang cepat dengan cepat dan puck yang lambat dengan perlahan, hingga berhenti. Angka yang lebih besar dari 2 membuat permukaannya lebih kasar.
Jika tombol ditekan cukup lama, dorongan dan gesekan akan seimbang pada kecepatan maksimum 600 / 2 = 300 piksel per detik.
Tantangan
Sedang- Di dalam perulangan, ganti
vel = pygame.Vector2(0, 0)denganacc = pygame.Vector2(0, 0), lalu buat setiap tombol panah mengaturacc.xatauacc.yke600atau-600. - Sebelum menggerakkan puck, tambahkan
acc * dtkevel, lalu kurangivel * 2 * dtdarinya.
Coba sendiri
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()
Semua pelajaran di Perulangan Game
1Gerakkan Persegi
Buka JendelaIsi Latar Belakang4Bergerak Berdasarkan Waktu
Delta WaktuPiksel per DetikVector2Percepatan dan GesekanBerputar Kembali di LayarLatihan sendiri: Playground Pygame