Движение на обекти в 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