zoukankan      html  css  js  c++  java
  • python+pygame的导弹追踪鼠标游戏设置和说明

    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()
    View Code
  • 相关阅读:
    JWT在ASP.NET Core3.1的应用
    .NET Core 3.0中IAsyncEnumerable<T>有什么大不了的?
    C#类继承中构造函数的执行序列
    C#中的out 参数,ref参数,值参数
    ABP之启动配置
    ABP之模块系统
    ABP之N层架构
    ABP之什么是ABP(ASP.NET Boilerplate)
    如何使用ASP.NET Core、EF Core、ABP(ASP.NET Boilerplate)创建分层的Web应用程序(第一部分)
    ABP之Setting
  • 原文地址:https://www.cnblogs.com/ysysbky/p/12256073.html
Copyright © 2011-2022 走看看