如何在 pygame 中以一定角度发射子弹?
How to shoot a bullet at an angle in pygame?
我正在 pygame 中制作游戏,当您发射子弹时,子弹的飞行方向与您的鼠标相同。这是我的代码 Player
class:
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岁),去年学了画直线,所以如果有更简单的方法来制作子弹路径,请告诉我。
这是我的 Bullet 代码 Class
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
精灵越远,子弹行进得越快(因为当我找到直线的斜率时,鼠标和精灵之间的差异越大玩家,子弹的速度越快)。我怎样才能做出更好的发射子弹的系统?
如果你想让速度不依赖于鼠标距离,你应该标准化到鼠标的距离。
换句话说,无论鼠标在哪里,都使用同一个方向的点的坐标,但与起始位置的距离固定,例如当您计算 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
我正在 pygame 中制作游戏,当您发射子弹时,子弹的飞行方向与您的鼠标相同。这是我的代码 Player
class:
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岁),去年学了画直线,所以如果有更简单的方法来制作子弹路径,请告诉我。
这是我的 Bullet 代码 Class
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
精灵越远,子弹行进得越快(因为当我找到直线的斜率时,鼠标和精灵之间的差异越大玩家,子弹的速度越快)。我怎样才能做出更好的发射子弹的系统?
如果你想让速度不依赖于鼠标距离,你应该标准化到鼠标的距离。
换句话说,无论鼠标在哪里,都使用同一个方向的点的坐标,但与起始位置的距离固定,例如当您计算 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