1 问题
对QN-506上的S570智能反坦克制导导弹的射后不管产生了浓厚的兴趣,想用Python简易还原一下。
2 方法
之前查阅资料时了解到使用pygame库制作的贪吃蛇,是否有一种方法能让“贪吃蛇”一直跟着鼠标走呢?
鼠标模拟行进中的坦克,“蛇头”模拟S570巡飞弹;
先把pygame框架搭好,把导弹的基本参数定义好;
导弹是会拐弯的,但它不是质点,所以引入了一张矩形图片,还要把它的旋转效果做出来。
但就在我认知范围内在pygame中做出旋转效果并不容易;
查阅相关资料后了解到可以让图片变形实现旋转效果,可以用以下代码实现:
screen.blit(missiled,(x1-width+(x1-C[0]),y1-height/2+(y1-C[1])));
通过实验、实践等证明提出的方法是有效的,是能够解决开头提出的问题。
代码清单 1
import pygame,sys from math import * pygame.init() font1=pygame.font.SysFont('microsoftyaheimicrosoftyaheiui',23) textc=font1.render('T',True,(250,0,0)) screen=pygame.display.set_mode((800,700),0,32) missile=pygame.image.load('missile.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: A = (x1 - width, y1 - height/2+height*(-cosa)) B = (x1 - width+height*sina, y1 - height/2) if -90<=-fangle<0: A = (x1 - width+missiled.get_width(), y1 - height/2+missiled.get_height()-height*cosa) B = (A[0]+height*sina, y1 - height/2+missiled.get_height()) if -180<-fangle<-90: A = (x1-width-height*sina, y1 - height/2+missiled.get_height()) B = (x1 - width,A[1]+height*cosa ) C = ((A[0] + B[0]) / 2, (A[1] + B[1]) / 2) screen.fill((0,0,0)) screen.blit(missiled, (x1-width+(x1-C[0]),y1-height/2+(y1-C[1]))) screen.blit(textc, (x,y)) #鼠标用一个红色T代替 pygame.display.update() 附件:代码中的missile.png文件 |
3 结语
针对在pygame中实现图片旋转的问题,提出显示图片时将其移动的方法,通过实机实验,证明该方法是有效的。未来还可以加入导弹撞击到“T”时的爆炸效果。