子弹射击奇怪的角度pygame

时间:2015-07-30 04:47:24

标签: python pygame vector-graphics

我在pygame中编写了一个2d自上而下的射击游戏,我遇到了一个问题,我试图射击子弹的矢量图形。子弹正在射击,但他们并没有像他们应该向射击射击。我之前遇到过这个问题,我知道它与我的子弹移动功能代码有关,我已在下面提供,但我无法弄明白我的情况。我做错了。

查看他们在此处运行完整档案时发出的奇怪角度https://github.com/hailfire006/economy_game/blob/master/shooter_game.py

class Bullet:
    def __init__(self,mouse,player):
        self.x = player.x
        self.y = player.y
        self.name = "bullet"
        self.speed = 13
        self.mouse = mouse
        self.dx,self.dy = self.mouse
    def move(self):
        distance = [self.dx - self.x, self.dy - self.y]
        norm = math.sqrt(distance[0] ** 2 + distance[1] ** 2)
        direction = [distance[0] / norm, distance[1] / norm]
        bullet_vector = [direction[0] * self.speed, direction[1] * self.speed]

        self.x -= bullet_vector[0]
        self.y -= bullet_vector[1]

    def draw(self):
        square = pygame.Rect((self.x,self.y),(20,20))
        pygame.draw.rect(screen,(200,100,40),square)

编辑:修正拼写错误

2 个答案:

答案 0 :(得分:4)

您的代码有3个问题。 @DTing已经提到了错字。这使得子弹朝着相反的方向前进。

要使子弹以与鼠标单击相同的方向射击,您需要更改以下行:

self.x -= bullet_vector[0]
self.y -= bullet_vector[1]

self.x += bullet_vector[0]
self.y += bullet_vector[1]

现在你的子弹朝着正确的方向前进,但是一旦它们到达鼠标点击的位置,它们就会停止。这是因为你每次移动都会得到子弹矢量。您可以在init函数中获取一次,并且只需在每次连续调用时重复使用它。以下是我为使代码工作所做的更改:

def __init__(self,mouse,player):
    self.x = player.x
    self.y = player.y
    self.name = "bullet"
    self.speed = 13
    self.mouse = mouse
    self.dx,self.dy = self.mouse
    distance = [self.dx - self.x, self.dy - self.y]
    norm = math.sqrt(distance[0] ** 2 + distance[1] ** 2)
    direction = [distance[0] / norm, distance[1] / norm]
    self.bullet_vector = [direction[0] * self.speed, direction[1] * self.speed]

def move(self):
    self.x += self.bullet_vector[0]
    self.y += self.bullet_vector[1]

您的代码现在将按预期工作。

答案 1 :(得分:3)

变量的命名有些令人困惑,但我很确定这是一个错字:

    distance = [self.dx - self.x, self.dy, self.y]

应该是:

    distance = [self.dx - self.x, self.dy - self.y]