Движение объекта Pygame с наклонами/углами

Я пытаюсь создать игру, в которой, когда игрок щелкает, игрок стреляет снарядом по тому же пути, что и точка, на которую нажали. Мой код пока работает нормально, за исключением того, что чем дальше игрок щелкает, тем быстрее он движется. Вот код:

class Projectile(pygame.sprite.Sprite):
    x2 = 0
    y2 = 0
    slope_x = 0
    slope_y = 0
    attack_location = ()
    slope = 0

    def __init__(self,image):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.image.load(image)
        self.rect = self.image.get_rect()
        self.rect.x = 390
        self.rect.y = 289
        self.attack_location = (mouse_x,mouse_y)
        self.mask = pygame.mask.from_surface(self.image)
        self.x2 = self.attack_location[0]
        self.y2 = self.attack_location[1]
        self.slope_y = self.y2 - 300
        self.slope_x = self.x2 - 400

    def update(self):
        self.rect.x += (self.slope_x) / 15
        self.rect.y += (self.slope_y) / 15

Мой код немного неаккуратный и простой, но я хотел бы знать, есть ли способ установить постоянную скорость или, может быть, даже использовать тригонометрию для движения снаряда под углом.

На самом деле мне удалось нормализовать вектор, но снаряд выходит как будто из (0,0), а позиция персонажа (400,300). Мне интересно, есть ли способ сделать так, чтобы вектор начинался с (400 300), или есть другое решение моей исходной проблемы. Спасибо! Вот код:

    def __init__(self,image):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.image.load(image)
        self.rect = self.image.get_rect()
        self.rect.x = 0
        self.rect.y = 0
        self.attack_location = (mouse_x,mouse_y)
        self.mask = pygame.mask.from_surface(self.image)
        self.x2 = self.attack_location[0]
        self.y2 = self.attack_location[1]
        self.d = math.sqrt(((self.x2)**2) + ((self.y2)**2))
        self.slope_x = self.x2 / self.d
        self.slope_y = self.y2 / self.d

    def update(self):
        self.rect.x += (self.slope_x) * 10
        self.rect.y += (self.slope_y) * 10​

person Bagel    schedule 05.04.2015    source источник
comment
По мере того, как вы нажимаете дальше, x2, y2 становится больше (или меньше). Это означает, что slope_y, slope_x становится больше. Это означает, что приращение, которое вы увеличиваете rect.x, rect.y, больше. Поэтому каждый раз, когда вы обновляете позицию ракеты, она увеличивается на меньшую или большую величину в зависимости от того, где вы щелкнули.   -  person JGerulskis    schedule 06.04.2015
comment
Я понимаю, я просто хотел знать, есть ли способ предотвратить это. Спасибо хоть.   -  person Bagel    schedule 06.04.2015


Ответы (1)


Вы должны нормализовать вектор направления. Что-то вроде этого:

d = math.sqrt(mouse_x * mouse_x + mouse_y * mouse_y)
self.slope_x = mouse_x / d - 300
self.slope_y = mouse_y / d - 400
person Tin Rabzelj    schedule 05.04.2015