So basically ive been hoping it would be possible to effectively turn your sprite while moving it around with WASD. Any ideas because im certainly stumped, thanks!
Asked
Active
Viewed 666 times
1
-
@JamesHuang *"You will have to do a bit of math to get it around the center "* - it is trivial. See the answer. – Rabbid76 Nov 11 '20 at 19:38
-
1@Rabbid76 Got the basic concept, thanks! – BetterNot Nov 11 '20 at 20:20
1 Answers
3
See How do I rotate an image around its center using PyGame? for rotating a surface. If you want to rotate an image around a center point (cx, cy) you can just do that:
rotated_car = pygame.transform.rotate(car, angle)
window.blit(rotated_car, rotated_car.get_rect(center = (cx, cy))
Use pygame.math.Vector2
to store the position
and the direction
of movement. Change the position
by the current direction
when w respectively s is pressed. Change the angle of the direction
vector with rotate_ip
, when a respectively d is pressed:
keys = pygame.key.get_pressed()
if keys[pygame.K_w]:
position += direction
if keys[pygame.K_s]:
position -= direction
if keys[pygame.K_a]:
direction.rotate_ip(-1)
if keys[pygame.K_d]:
direction.rotate_ip(1)
See also:
Minimal example: repl.it/@Rabbid76/PyGame-CarMovement
import pygame
pygame.init()
window = pygame.display.set_mode((500, 500))
clock = pygame.time.Clock()
car = pygame.image.load('CarRed64.png')
position = pygame.math.Vector2(window.get_rect().center)
direction = pygame.math.Vector2(5, 0)
run = True
while run:
clock.tick(60)
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
keys = pygame.key.get_pressed()
if keys[pygame.K_w]:
position += direction
if keys[pygame.K_s]:
position -= direction
if keys[pygame.K_a]:
direction.rotate_ip(-1)
if keys[pygame.K_d]:
direction.rotate_ip(1)
window.fill(0)
angle = direction.angle_to((1, 0))
rotated_car = pygame.transform.rotate(car, angle)
window.blit(rotated_car, rotated_car.get_rect(center = (round(position.x), round(position.y))))
pygame.display.flip()
pygame.quit()
exit()

Rabbid76
- 202,892
- 27
- 131
- 174