Python/Pygame 矢量数学

Python/Pygame Vector Math

我在小型 "battle simulation" 程序中遇到向量和向量数学方面的问题。屏幕两边各有15个"guys",在不同的X/Y位置。当他们选择要射击的敌人时,我无法让他们以正确的角度射击。目前我有这个来确定子弹射击后的路径。此代码与项目符号矩形和目标 X/Y 位置有关。

    diff = (self.startX - self.destX, self.startY - self.destY)
    distance = math.sqrt(diff[0]**2 + diff[1]**2)
    diff_norm = (diff[0] / distance, diff[1] / distance)
    self.rect.x -= diff_norm[0]
    self.rect.y -= diff_norm[1]

但这只是让项目符号全部进入屏幕的左上角。 大 blue/white 方块是随机移动的家伙,白色小方块是子弹。

http://gyazo.com/8f219a6b0b561b72bcccdea7e325c51a (最好点击右上角的“...”查看mp4格式的gif)

有的不动,有的直飞...这是怎么回事?

问题是 Rect 中的 x 和 y 坐标都是整数,并且您设置的坐标在每一帧都不断向下舍入到最接近的整数值。

因为您正在标准化 start->dest 向量,这意味着 diff_norm 中的所有值都将在 -1.0 到 1.0 的范围内,因此发生的舍入与动作的大小,足以完全甩掉它。

为了解决这个问题,在你的子弹中存储当前位置的值,当你发射子弹时初始化,你可以使用浮点计算来操作,然后根据每帧的值分配矩形 x 和 y,例如:

self.positionX -= diff_norm[0]
self.positionY -= diff_norm[1]
self.rect.x = int(self.positionX)
self.rect.y = int(self.positionY)

这样当前位置的小数部分就不会在每一帧丢失。