2015-06-22 45 views
1

我在小型“战斗模拟”程序中遇到了一些向量和矢量数学问题。屏幕两侧有15个“人”,位于不同的X/Y位置。当他们选择想要射击的敌人时,我无法让他们以正确的角度拍摄。目前,我有这个来确定他们射击后的子弹路径。该代码是关于子弹矩形和目标X/Y位置的。Python/Pygame矢量数学

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

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

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

+0

非常感谢,这是它的问题,它现在工作完美,并且你解释了所有我能理解的东西。 – user3371207