Pygame: hacer que un sprite se mueva en la dirección hacia la que está orientado.

Estoy haciendo un juego de carreras de coches de arriba abajo y quiero hacer que el coche gire cuando presionas las teclas izquierda y derecha (ya he hecho esa parte), la rotación del sprite se almacena en una variable como grados. Me gustaría poder moverlo de acuerdo con la aceleración en la dirección hacia la que está orientado. Yo mismo puedo entender la parte de la aceleración, es solo averiguar qué píxel está exactamente en esa dirección. ¿Alguien puede darme un código simple para ayudar con esto?

Aquí están los contenidos de la clase que son relevantes:

def __init__(self, groups): super(Car, self).__init__(groups) self.originalImage = pygame.image.load(os.path.join("Data", "Images", "Car.png")) #TODO Make dynamic self.originalImage.set_colorkey((0,255,0)) self.image = self.originalImage.copy() # The variable that is changed whenever the car is rotated. self.originalRect = self.originalImage.get_rect() # This rect is ONLY for width and height, the x and y NEVER change from 0! self.rect = self.originalRect.copy() # This is the rect used to represent the actual rect of the image, it is used for the x and y of the image that is blitted. self.velocity = 0 # Current velocity in pixels per second self.acceleration = 1 # Pixels per second (Also applies as so called deceleration AKA friction) self.topSpeed = 30 # Max speed in pixels per second self.rotation = 0 # In degrees self.turnRate = 5 # In degrees per second self.moving = 0 # If 1: moving forward, if 0: stopping, if -1: moving backward self.centerRect = None def update(self, lastFrame): if self.rotation >= 360: self.rotation = 0 elif self.rotation  0: self.image = pygame.transform.rotate(self.originalImage.copy(), self.rotation) self.rect.size = self.image.get_rect().size self.center() # Attempt to center on the last used rect if self.moving == 1: self.velocity += self.acceleration #TODO make time based if self.velocity > self.topSpeed: self.velocity = self.topSpeed # Cap the velocity 

Trigonometría: La fórmula para obtener tu coordenada es:

 # cos and sin require radians x = cos(radians) * offset y = sin(radians) * offset 

Se utiliza la velocidad para el desplazamiento . (Esto significa que una velocidad negativa conducirá hacia atrás).

asi que:

 def rad_to_offset(radians, offset): # insert better func name. x = cos(radians) * offset y = sin(radians) * offset return [x, y] 

loop_update es algo como:

 # vel += accel # pos += rad_to_offset( self.rotation, vel ) 

math.cos, math.sin: usa radianes, entonces

Almacenar rotaciones como radianes es más simple. Si desea definir la velocidad / etc como grados, todavía puede.

 # store radians, but define as degrees car.rotation_accel = radians(45) car.rotation_max_accel = radians(90) 

Realmente no puedo hacerlo mejor que indicarte este tutorial (*). En particular, la primera parte explica cómo hacer la rotación y hacer que los sprites se muevan en ciertas direcciones.


(*) Enchufe descarado 🙂 pero muy relevante a la pregunta.