Pygame - заставляет спрайт двигаться в направлении - PullRequest
3 голосов
/ 18 марта 2011

Я играю в автомобильные гонки сверху вниз и хочу, чтобы машина вращалась, когда вы нажимаете левую и правую клавиши (я уже сделал эту часть), вращение спрайта сохраняется в переменной в градусах. Я хотел бы иметь возможность заставить его двигаться в соответствии с ускорением в направлении, в котором он стоит. Я сам могу определить часть ускорения, она просто определяет, какой именно пиксель находится в этом направлении. Кто-нибудь может дать мне простой код, чтобы помочь с этим?

Вот содержимое класса, которые имеют отношение:

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.rotation += 360

    if 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

Ответы [ 2 ]

4 голосов
/ 27 апреля 2011

Тригонометрия: формула для получения вашей координаты:

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

Вы используете скорость для смещения .(Это означает, что отрицательная скорость будет двигаться в обратном направлении).

так:

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

loop_update выглядит примерно так:использует радианы, поэтому

хранить вращения как радианы проще.Если вы хотите определить скорость / и т.д. в градусах, вы все равно можете это сделать.

# store radians, but define as degrees
car.rotation_accel = radians(45)
car.rotation_max_accel = radians(90)
1 голос
/ 18 марта 2011

Я не могу сделать лучше, чем указать вам этот урок (*).В частности, первая часть объясняет, как делать вращение и заставлять спрайтов двигаться в определенных направлениях.


(*) Бесстыдная заглушка :-), но очень актуальная для вопроса.

...