Python / Pygame矢量数学

时间:2015-06-22 18:48:23

标签: python math vector pygame

我在一个小的“战斗模拟”程序中遇到了矢量和矢量数学的麻烦。屏幕两侧各有15个“伙伴”,处于不同的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]

但是这只是子弹全部到达屏幕的左上角(ish)。 大蓝/白方块是随机移动的家伙,小白方块是子弹。

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

有些人不动,有些人直接飞起来...这里发生了什么?

1 个答案:

答案 0 :(得分:1)

问题是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)

这样,当前位置的小数部分每帧都不会丢失。