如何在Pygame中以一定角度射击子弹?

时间:2018-09-06 22:56:36

标签: python math pygame bulletphysics bullet

我正在用pygame做游戏,当您发射子弹时,子弹的移动方向与鼠标的方向相同。这是我的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_xb_m_yx的更改和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 :(得分:0)

如果您希望速度不取决于鼠标的距离,则应该标准化与鼠标的距离。

换句话说,无论鼠标在哪里,都使用相同方向上的点的坐标,但是距起始位置的距离固定为例如在计算b_m_xb_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