Menu
CoddyTech

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 * dt

Buat 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.

challenge icon

Tantangan

Sedang
  1. Di dalam perulangan, ganti vel = pygame.Vector2(0, 0) dengan acc = pygame.Vector2(0, 0), lalu buat setiap tombol panah mengatur acc.x atau acc.y ke 600 atau -600.
  2. Sebelum menggerakkan puck, tambahkan acc * dt ke vel, lalu kurangi vel * 2 * dt darinya.

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

Latihan sendiri: Playground Pygame