Accélération et friction
Fait partie de la section La boucle de jeu du Journey Pygame de Coddy. Leçon 21 sur 32.
Le palet démarre à pleine vitesse et s’arrête net quand tu le lâches. Sur la glace, il devrait prendre de la vitesse et glisser. Deux changements permettent d’obtenir ce résultat.
L’accélération correspond à la vitesse à laquelle la vélocité change, en pixels par seconde, chaque seconde. Les touches définissent l’accélération, et l’accélération modifie la vélocité :
acc = pygame.Vector2(0, 0)
if keys[pygame.K_RIGHT]:
acc.x = 600
vel += acc * dt
vel -= vel * 2 * dt
pos += vel * dtCrée acc à chaque image, afin qu’elle soit nulle lorsqu’aucune touche n’est maintenue. La vélocité conserve sa valeur d’une image à l’autre, donc le palet continue de glisser.
Le frottement correspond à la deuxième ligne. vel * 2 * dt est une petite partie de la vélocité, plus grande lorsque le palet va vite. La soustraire à chaque image ralentit rapidement un palet rapide et doucement un palet lent, jusqu’à ce qu’il s’arrête. Un nombre supérieur à 2 correspond à un sol plus rugueux.
Si la poussée est maintenue assez longtemps, elle s’équilibre avec le frottement à une vitesse maximale de 600 / 2 = 300 pixels par seconde.
Défi
Moyen- Dans la boucle, remplace
vel = pygame.Vector2(0, 0)paracc = pygame.Vector2(0, 0), et fais en sorte que chaque flèche définisseacc.xouacc.yà600ou-600. - Avant de déplacer le palet, ajoute
acc * dtàvel, puis soustrais-luivel * 2 * dt.
Essayez vous-même
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()
Toutes les leçons de La boucle de jeu
1Déplacer un carré
Ouvrir une fenêtreRemplir l’arrière-plan4Déplacement en fonction du temps
Temps deltaPixels par secondeVector2Accélération et frictionBoucler autour de l’écranEntraînez-vous par vous-même : Playground Pygame