正文
.
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里面做旋转并不是一件容易的事情(也可能是我无知),好吧我们先把图片替换成一张矩形的,再加入旋转函数看看效果如何
missiled = pygame.transform.rotate(missile, -(d_angle))
screen.blit(missiled, (x1-missile.get_width(), y1-missile.get_height()/2))
因为图片的坐标点是它的左上角的点,所以如果我们想让图片的坐标固定在箭头尖点,那么把图片实际打印位置x减少图片长度,y减少一半宽度就行。
但是实际运行效果并不好:
大致方向相同,但是图片箭头的尖点并没有一直跟随鼠标,这是为什么呢。经过我的研究(就因为这个问题没解决一直没发布),
我发现原来是这个图旋转的机制问题,我们看看旋转后的图片变成什么样了:
旋转后的图片变成了蓝色的那个范围,根据旋转角度的不同,所变成的图片大小也不一样,我们看旋转90的情况
我们发现,旋转后的图片不仅面积变大了,导弹头的位置也变了。那应该怎么解决这个问题呢?思路是,每一次旋转图片以后,求出旋转图的头位置(图中的绿色箭头点),然后把绿图的打印位置移动一下,下,x,y分别移动两个头的距离,就可以让旋转后的导弹头对准实际我们参与运算的那个导弹头的位置,移动后应该是这样的: