• python3 飞机大战游戏开发历程


    一、先安装pygame,我自己的系统是windows10,在cmd命令行下执行如下命令:

    python -m pip install --user pygame

    注意:python用如下命令安装软件包:

    python -m pip install <package_name>

    此时安装的软件包名字是pygame。

    二、开发游戏需要的一些函数

    1. #导入pygame模块
    2. import pygame #导入pygame模块
    3. #导入sys库,里面有能够结束python解释器的exit()函数
    4. import sys #导入sys模块,这个模块中有可以关闭窗口的函数
    5. #初始化pygame
    6. pygame.init() #初始化pygame(初始化pygame的背景设置),使得pygame能正确地工作
    7. #pygame.init()是Pygame库中的一个重要函数,用于初始化Pygame模块,以便后续能够正常使用Pygame提供的各种功能。
    8. #创建游戏窗口
    9. screen = pygame.display.set_mode((width,height)) #创建一个名(窗口的名字,不是窗口上显示的名字)为screen,大小为(width,height)的窗口,创建的窗口必须用动画循环去绘制,不然窗口闪烁以下就自己关闭
    10. 了。
    11. #设置背景颜色
    12. screen.fill(bg_color) #bg_color表示背景色,是一个颜色元组,颜色字符串或者十六进制颜色颜色代码
    13. 例如:bg_color = 'green',bg_color = '#ff0000' bg_color = (230,230,230)——3个数字越小,颜色越深,数字越大,颜色越亮.
    14. #设置窗口(游戏)标题
    15. pygame.display.set_caption("title") #设置游戏标题
    16. #或者游戏事件列表
    17. pygame.event.get() #​pygame.event.get() 是 Pygame 库中的一个函数,用于从事件队列中获取所有待处理的事件并返回一个事件列表。例如:如果玩家单击游戏窗口的关闭按钮时,将检测到pygame.QUIT事件.
    18. 1.如果按下了窗口的“关闭”按钮,那么event.type == pygame.QUIT
    19. #(瞬时地)更新游戏实时画面
    20. pygame.display.flip() #(极短的时间内)更新游戏屏幕,显示游戏的实时画面,从而制造出动画效果,如果想一直更新屏幕,那么需要把这句代码放在while True(即无限循环中),事实上,通常也是先创建游戏的窗口,设置标题,紧接着把这句代码放在无限循环中。然后把他们一起放在一个模块内。
    21. #退出python解释器
    22. sys.exit() #在python中,sys.exit() 函数用于退出程序。当调用 sys.exit() 函数时,Python 解释器将会立即退出程序,并返回一个状态码。

    三、一些概念

    (一)surface

    (surface的概念部分转载自下面的博客)

    Pygame库中Surface 对象介绍_pygame.surface-CSDN博客

    surface:Pygame库中Surface 对象

            在Pygame库中,Surface 对象是一个非常核心的概念,它代表了一个二维的矩形画布,可以在上面绘制图像、图形、文本等内容。每个 Surface 都有自己的像素格式和尺寸,它们可以被用来表示游戏中的任何可见元素,比如背景、角色、物品等。

    创建Surface对象

    你可以通过多种方式创建一个 Surface 对象:

    通过 pygame.display.set_mode() 创建主显示 Surface,这通常是游戏窗口的画布。
    screen = pygame.display.set_mode((width, height))
    通过 pygame.Surface() 直接创建一个新的 Surface 对象。
    new_surface = pygame.Surface((width, height))
    通过加载一个图像文件创建 Surface 对象。
    image_surface = pygame.image.load('image.png')
    Surface对象的属性和方法

    Surface 对象有很多属性和方法,以下是一些常用的:

    get_size(): 返回 Surface 对象的尺寸,即宽和高。
    get_width(): 返回 Surface 对象的宽度。
    get_height(): 返回 Surface 对象的高度。
    fill(): 使用单一颜色填充整个 Surface。
    blit(): 将一个 Surface 对象绘制到另一个上面,这是图像合成的基本操作。
    convert(): 改变 Surface 的像素格式,以更好地匹配显示设备,这可以提高绘制速度。
    set_alpha(): 设置 Surface 的透明度。
    get_rect(): 获取一个矩形对象,其大小与 Surface 相同,常用于处理位置和碰撞检测。
    绘制和更新Surface

    在Pygame中,当你对 Surface 进行绘制操作后,这些操作不会立即反映到屏幕上。你需要调用 pygame.display.flip() 或 pygame.display.update() 来更新显示的内容。

    pygame.display.flip(): 更新整个屏幕的内容。
    pygame.display.update(): 可以更新屏幕的一个区域或多个区域。
    Pygame 中 Surface 对象的基本使用方法如下:

    1、创建 Surface 对象

    要在 Pygame 中创建一个 Surface 对象,你可以使用 pygame.Surface() 函数,并传入一个元组,指定你希望创建的 Surface 的宽度和高度:

    import pygame

    # 初始化pygame
    pygame.init()

    # 创建一个Surface对象
    surface_width = 800
    surface_height = 600
    my_surface = pygame.Surface((surface_width, surface_height))
     

    2、绘制 Surface 对象

    你可以使用各种 Pygame 的绘图函数来在 Surface 上绘制图形。例如,你可以在一个 Surface 上绘制一个矩形:

    # 设置颜色
    color = (255, 0, 0) # RGB颜色,这里是红色

    # 绘制一个矩形
    # pygame.draw.rect(Surface, color, Rect, width=0)
    pygame.draw.rect(my_surface, color, (10, 10, 50, 50))
     

    3、显示 Surface 对象

    创建和绘制 Surface 之后,你需要将它绘制到主显示 Surface 上,这通常是你通过 pygame.display.set_mode() 获取的 Surface。你可以使用 blit 方法来完成这个操作:

    # 创建主显示Surface
    screen = pygame.display.set_mode((800, 600))

    # 把我们创建的Surface对象绘制到主显示Surface上
    screen.blit(my_surface, (0, 0))

    # 更新整个待显示的 Surface 对象到屏幕上
    pygame.display.flip()

    4、事件循环

    在 Pygame 中,你需要设置一个事件循环来保持游戏的运行,并在适当的时候处理事件(如按键和退出):

    # 游戏主循环
    running = True
    while running:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False

        # 其他游戏逻辑和渲染

        # 更新显示
        pygame.display.flip()

    # 退出pygame
    pygame.quit()

    使用Python的pygame库画花
    例1、效果图:

    源码如下:

    import pygame
    import sys
     
    # 初始化pygame
    pygame.init()
     
    # 设置窗口尺寸
    width, height = 400, 400
    screen = pygame.display.set_mode((width, height))
    pygame.display.set_caption('画花')
     
    # 定义颜色
    WHITE = (255, 255, 255)
    RED = (255, 0, 0)
    YELLOW = (255, 255, 0)
    GREEN = (0, 255, 0)
    BROWN = (139, 69, 19)
     
    # 绘制背景
    screen.fill(WHITE)
     
    # 画花
    pygame.draw.circle(screen, RED, (200, 200), 30)  # 花心
    pygame.draw.circle(screen, YELLOW, (170, 170), 30)  # 花瓣1
    pygame.draw.circle(screen, YELLOW, (230, 170), 30)  # 花瓣2
    pygame.draw.circle(screen, YELLOW, (170, 230), 30)  # 花瓣3
    pygame.draw.circle(screen, YELLOW, (230, 230), 30)  # 花瓣4
     
    # 画枝条
    pygame.draw.rect(screen, BROWN, (195, 250, 10, 100))  # 枝条
     
    # 画叶子
    pygame.draw.polygon(screen, GREEN, [(100, 200), (150, 280), (195, 300)])  # 左叶子
    pygame.draw.polygon(screen, GREEN, [(280, 200), (250, 280), (205, 300)])  # 右叶子
     
    # 刷新屏幕
    pygame.display.flip()
     
    # 保持窗口打开
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
    例2、效果图:

    源码如下:

    import pygame
    import sys
     
    # 初始化 Pygame
    pygame.init()
     
    # 设置屏幕大小
    screen = pygame.display.set_mode((600, 400))
     
    # 设置标题
    pygame.display.set_caption("花")
     
    # 定义樱花的颜色
    red = (255, 0, 0)
    Green = (0, 255, 0)
    # 定义枝条的颜色
    brown = (139, 69, 19)
     
    def draw_cherry_blossom(x, y):
        # 绘制樱花的五个瓣
        pygame.draw.ellipse(screen, red, (x, y, 10, 20))
        pygame.draw.ellipse(screen, red, (x+10, y-10, 20, 10))
        pygame.draw.ellipse(screen, red, (x+20, y, 10, 20))
        pygame.draw.ellipse(screen, red, (x+5, y+10, 20, 10))
        pygame.draw.ellipse(screen, red, (x-10, y+10, 20, 10))
     
        # 绘制花的中心
        pygame.draw.circle(screen, (255, 255, 255), (x+15, y+15), 5)
        
        # 绘制枝条
        pygame.draw.line(screen, Green, (x+15, y+1), (x+15, y+35), 2)
        pygame.draw.line(screen, brown, (x+10, y+35), (x+20, y+35), 4)
     
     
    # 游戏主循环
    running = True
    while running:
        # 处理事件
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
     
        # 填充背景
        screen.fill((255, 255, 255))
     
     
        # 绘制花
        draw_cherry_blossom(150, 200)
        draw_cherry_blossom(250, 250)
        draw_cherry_blossom(300, 180)
        draw_cherry_blossom(320, 280)
        draw_cherry_blossom(400, 200)
     
        # 更新屏幕
        pygame.display.flip()
     
    # 退出 Pygame
    pygame.quit()
    sys.exit()
    说明:pygame.draw.line(screen, Green, (100,200),(220,320),2)的意思:

    pygame.draw.line: 这是pygame库中的一个函数,用于绘制线段。

    screen: 这是一个pygame的Surface 对象,通常是你想要绘制线的屏幕或窗口。

    Green: 这是一个颜色元组,表示线的颜色。在这个例子中,线将是绿色的。

    (100,200): 这是线段起始点的坐标。

    (220,320): 这是线段终点的坐标。

    2: 这是线段的宽度。

    (二)pygame.event.get()的介绍

       pygame.event.get() 是 Pygame 库中的一个函数,用于从事件队列中获取所有待处理的事件并返回一个事件列表

    Pygame 库主要用于游戏开发,其中事件是指用户在游戏中发出的各种操作,例如按键、鼠标移动、点击等。这些事件被存储在一个事件队列中,程序需要不断从队列中获取事件并作出相应的响应,从而使游戏能够与用户进行交互。

    pygame.event.get() 函数的作用是从事件队列中获取所有待处理的事件,并将它们作为一个事件列表返回。程序可以通过对事件列表进行遍历,逐一判断每个事件的类型,并根据需要做出相应的响应。例如,如果用户按下了键盘上的某个按键,程序可以通过判断事件类型为“按键按下”来执行相应的操作。

    需要注意的是,pygame.event.get() 函数只会获取当前在事件队列中的事件,并不会等待新的事件产生。如果事件队列中没有待处理的事件,该函数会返回一个空的事件列表。因此,在程序中需要不断地调用该函数来获取事件,以保证游戏的正常交互。

  • 相关阅读:
    Spring Boot 自动装配
    Snowflake 获 2021 年度数据库称号;Linus 成为 Linux 项目中最强 committer;OpenHarmony 3.1 Beta 版发布 | 开源日报
    基于SWOT的智能手机企业财务战略研究1.62
    安卓Ampere Pro(充电评测)v4.09解锁专业版,供大家学习研究参考!
    web前端-html自定义列表
    php+mysql幼儿园早教网站
    Ubuntu系统上传文件的多种方法-断网上传-安装包上传-物联网开发维护
    css:html元素的定位
    5个设计类宝藏网站分享
    【代码源每日一题Div1】子串的最大差「单调栈?」「ST表 + 二分」
  • 原文地址:https://blog.csdn.net/digitalkee/article/details/140109334