专栏名称: 程序员大咖
为程序员提供最优质的博文、最精彩的讨论、最实用的开发资源;提供最新最全的编程学习资料:PHP、Objective-C、Java、Swift、C/C++函数库、.NET Framework类库、J2SE API等等。并不定期奉送各种福利。
目录
相关文章推荐
程序员技术  ·  某程序员:感觉身边35岁后月薪稳定在40k以 ... ·  3 小时前  
伯乐在线  ·  HR ... ·  10 小时前  
伯乐在线  ·  HR ... ·  10 小时前  
京东科技技术说  ·  Taro on Harmony C-API ... ·  昨天  
程序员的那些事  ·  余承东暗讽某大厂,雷军疑似回应“诋毁是仰望” ... ·  3 天前  
码农翻身  ·  投诉领导被光速开除,和烂人说再见啦~ ·  昨天  
51好读  ›  专栏  ›  程序员大咖

Python 实现简单的导弹自动追踪

程序员大咖  · 公众号  · 程序员  · 2018-05-14 10:24

正文

请到「今天看啥」查看全文


. tick ( 300 )

  • x , y = pygame . mouse . get_pos () #获取鼠标位置,鼠标就是需要打击的目标

  • distance = sqrt ( pow ( x1 - x , 2 )+ pow ( y1 - y , 2 )) #两点距离公式

  • section = velocity * time #每个时间片需要移动的距离

  • sina =( y1 - y )/ distance

  • cosa =( x - x1 )/ distance

  • angle = atan2 ( y - y1 , x - x1 ) #两点线段的弧度值

  • x1 , y1 =( x1 + section * cosa , y1 - section * sina )

  • d_angle = degrees ( angle ) #弧度转角度

  • screen . blit ( missile , ( x1 - missile . get_width (), y1 - missile . get_height ()/ 2 ))

  • dis_angle = d_angle - old_angle #dis_angle就是到下一个位置需要改变的角度

  • old_angle = d_angle #更新初始角度

  • pygame . display . update ()

  • 如果仅把导弹考虑为一个质点的话,那么以上算法就已经足矣,我没有做导弹的旋转,因为一个质点也不分头尾不需要旋转,当然这前提得是你加载的导弹图片很小的时候不旋转看起来也没什么问题。但是在pygame里面做旋转并不是一件容易的事情(也可能是我无知),好吧我们先把图片替换成一张矩形的,再加入旋转函数看看效果如何

    1. missiled = pygame.transform.rotate(missile, -(d_angle))

    2. screen.blit(missiled, (x1-missile.get_width(), y1-missile.get_height()/2))

    因为图片的坐标点是它的左上角的点,所以如果我们想让图片的坐标固定在箭头尖点,那么把图片实际打印位置x减少图片长度,y减少一半宽度就行。

    但是实际运行效果并不好:

    大致方向相同,但是图片箭头的尖点并没有一直跟随鼠标,这是为什么呢。经过我的研究(就因为这个问题没解决一直没发布),

    我发现原来是这个图旋转的机制问题,我们看看旋转后的图片变成什么样了:

    旋转后的图片变成了蓝色的那个范围,根据旋转角度的不同,所变成的图片大小也不一样,我们看旋转90的情况

    我们发现,旋转后的图片不仅面积变大了,导弹头的位置也变了。那应该怎么解决这个问题呢?思路是,每一次旋转图片以后,求出旋转图的头位置(图中的绿色箭头点),然后把绿图的打印位置移动一下,下,x,y分别移动两个头的距离,就可以让旋转后的导弹头对准实际我们参与运算的那个导弹头的位置,移动后应该是这样的:







    请到「今天看啥」查看全文