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里面做旋转并不是一件容易的事情,我们先把图片替换成一张矩形的,再加入旋转函数看看效果如何

missiled = pygame.transform.rotate(missile, -(d_angle))screen.blit(missiled, (x1-missile.get_width(), y1-missile.get_height()/2))

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

大致方向相同,但是图片箭头的尖点并没有一直跟随鼠标,这是为什么呢。经过一番研究,我发现原来是这个图旋转的机制问题,我们看看旋转后的图片变成什么样了:

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

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

这样,两个导弹头的点就一致了。接下来我们分析求旋转后的导弹头的算法。根据旋转角度的不同,旋转角在不同象限参数不一样,所以我们分为这四种情况1,2象限

3,4象限,它的旋转只有正负0—180,所以3,4象限就是负角

显示图片的时候我们将他移动

screen.blit(missiled, (x1-width+(x1-C[0]),y1-height/2+(y1-C[1])))

这里的 (x1-width, y1-height/2) 其实才是上图中的 (x1, y1)所以最后我们加入相关算法代码,效果就比较完美了

大功告成,最后附上全部的算法代码

import pygame,sys

from math import *

pygame.init()

font1=pygame.font.SysFont(‘microsoftyaheimicrosoftyaheiui’,23)

textc=font1.render(‘*’,True,(250,0,0))

screen=pygame.display.set_mode((800,700),0,32)

missile=pygame.image.load(‘element/rect1.png’).convert_alpha()

height=missile.get_height()

width=missile.get_width()

pygame.mouse.set_visible(0)

x1,y1=100,600 #导弹的初始发射位置

velocity=800 #导弹速度

time=1/1000 #每个时间片的长度

clock=pygame.time.Clock()

A=()

B=()

C=()

while True:

for event in pygame.event.get():

if event.type==pygame.QUIT:

sys.exit()

clock.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) #两点间线段的弧度值

fangle=degrees(angle) #弧度转角度

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

missiled=pygame.transform.rotate(missile,-(fangle))

if 0<=-fangle<=90:

A=(width*cosa+x1-width,y1-height/2)

B=(A[0]+height*sina,A[1]+height*cosa)

if 90<-fangle<=180:

(1)Python所有方向的学习路线(新版)

这是我花了几天的时间去把Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

最近我才对这些路线做了一下新的更新,知识体系更全面了。

(2)Python学习视频

包含了Python入门、爬虫、数据分析和web开发的学习视频,总共100多个,虽然没有那么全面,但是对于入门来说是没问题的,学完这些之后,你可以按照我上面的学习路线去网上找其他的知识资源进行进阶。

(3)100多个练手项目

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了,只是里面的项目比较多,水平也是参差不齐,大家可以挑自己能做的项目去练练。

小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Python爬虫全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注:python)

n爬虫全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注:python) [外链图片转存中…(img-mXW7c0r4-1710874764093)]

推荐文章

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: