1.效果图
2.注意事项,代码里有说明
3.完整的代码
#导出模块 import pygame,sys from math import * #设置RESIZABLE前,必须导出下面的模块,否则报错 #同事放大窗口就会发现,窗口的背景默认黑色,但游戏的屏幕大小设定是固定的,如果设置不同颜色就会发现 from pygame.locals import * #初始化 pygame.init() #标题设置 pygame.display.set_caption("导弹追踪鼠标游戏") #如果不设置就是默认pygame window #screen=pygame.display.set_mode((800,700),0,32) #屏幕大小等设置 #RESIZABLE,屏幕大小可调节,我比较喜欢这个,一般都加入set_mode中 screen=pygame.display.set_mode((800,700),RESIZABLE,0,32) #鼠标头的设置,大小、样式、颜色、可见 font1=pygame.font.SysFont('microsoftyaheimicrosoftyaheiui',23) textc=font1.render('*',True,(250,0,0)) #鼠标为红色的* #在游戏区的屏幕里,0代表原始鼠标箭头不可见False;1代表可见,为True pygame.mouse.set_visible(0) #图片导弹引入和大小取值 #导弹图片不能太大,自己可以随意设定一张图片,放在指定的目录下 missile=pygame.image.load('missile1.png').convert_alpha() height=missile.get_height() width=missile.get_width() #定义导弹的相关参数 x1,y1=100,600 #导弹的初始发射位置 velocity=800 #导弹速度 time=1/1000 #每个时间片的长度 # 创建时钟对象 (可以控制游戏循环频率) clock=pygame.time.Clock() #定义三个空的元组,用来放坐标x和y A=() B=() C=() while True: #游戏的pygame的while循环 #退出设定,一般在pygame中固定在while的第一步 for event in pygame.event.get(): if event.type==pygame.QUIT: sys.exit() clock.tick(300) #每秒循环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)) #下面4个if为转角转弯设置 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) #屏幕的fill只能放在blit的前面 screen.fill((0,25,120)) #游戏所在的活动的屏幕bg背景填充深蓝色 #注意上面设置RESIZABLE提到的区别的黑色(0,0,0) #修改bug,增加1,目的就是将mx和my由float转换成int,因为在元组中需要int格式的数据 mx=int(float(x1-width+(x1-C[0]))) my=int(float(y1-height/2+(y1-C[1]))) #图片显示及位置mx和my,(mx,my)这是一个元组 #screen.blit(missiled, (x1-width+(x1-C[0]),y1-height/2+(y1-C[1]))) #报错bug screen.blit(missiled, (mx,my)) #修改bug,增加2 #鼠标显示及位置 screen.blit(textc, (x,y)) #鼠标用一个红色*代替 #游戏显示不断更新 pygame.display.update()