Как стрелять пулей под углом в пигме? - PullRequest
0 голосов
/ 07 сентября 2018

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

class Player(pygame.sprite.Sprite):
    def __init__(self, game, x, y):
        self.game = game
        pygame.sprite.Sprite.__init__(self, game.all_sprites)
        self.image = pygame.Surface((50, 50))
        self.image.fill(settings.player_color)

        self.rect = self.image.get_rect()
        self.rect.x, self.rect.y = x, y
        self.pos = Vector2(x, y)

        self.speed = Vector2(0, 0)

        self.is_shooting = False

    def update(self):
        self.pos += self.speed
        self.rect.x, self.rect.y = self.pos.x, self.pos.y

    def shoot(self):
        self.is_shooting = True
        m_x, m_y = pygame.mouse.get_pos()
        b_m_x, b_m_y = m_x - self.pos.x, m_y - self.pos.y
        b = Bullet(self.game, self.rect.x - 50, self.rect.y - 50 / 2, b_m_x, b_m_y)
        _, angle = (pygame.mouse.get_pos() - self.pos).as_polar()
        b.rotate(_)

То, как я делаю путь пули, я делаю так, чтобы пуля имела наклон, как линия. b_m_x и b_m_y - это изменение x и y.

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

Вот мой код для моего класса пули

class Bullet(pygame.sprite.Sprite):
    def __init__(self, game, x, y, run, rise):
        pygame.sprite.Sprite.__init__(self, game.all_sprites)
        self.image = pygame.Surface((15, 50))
        self.image.fill((255, 0, 0))

        self.rect = self.image.get_rect()
        self.rect.x, self.rect.y = x, y
        self.pos = pygame.math.Vector2(self.rect.x, self.rect.y)
        self.speed = pygame.math.Vector2(x=run / settings.bullet_speed_offset, y=rise / settings.bullet_speed_offset)

    def update(self):
        self.pos += self.speed
        self.rect.x, self.rect.y = self.pos.x, self.pos.y

    def rotate(self, angle):
        self.image = pygame.transform.rotozoom(self.image, angle, 1)
        self.rect = self.image.get_rect()

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

1 Ответ

0 голосов
/ 07 сентября 2018

Вам следует нормализовать расстояние до мыши, если вы хотите, чтобы скорость не зависела от расстояния до мыши.

Другими словами, независимо от того, где находится мышь, используйте координаты точки, которая находится в том же направлении, но на фиксированном расстоянии от начальной позиции, например. когда вы вычисляете свои b_m_x и b_m_y, сделайте это:

b_m_x, b_m_y = m_x - self.pos.x, m_y - self.pos.y

distance = (b_m_x ** 2 + b_m_y ** 2) ** .5

if distance != 0:
    # if distance is 0, nothing can be done

    NORMALIZED_DISTANCE = 100
    mutiplier = NORMALIZED_DISTANCE / distance

    b_m_x *= multipler
    b_m_y *= multipler
...