Python学习笔记 | 使用pygame模块编写飞机大战游戏(一)

Python学习笔记 | 使用pygame模块编写飞机大战游戏(一)

首页枪战射击飞机大战游戏更新时间:2024-05-09

pygame是一个第三方包,包含了一组用于开发游戏的python模块,使用之前需要先安装pygame这个包,安装分为两种情况:

windows系统中按Win R键再输入cmd进入命令行模式,输入命令行:

pip install pygame

如果使用的python版本在3.11之前,按照上面的方式就可以完成安装。但是我使用的是python最新版3.11,采用上面的默认安装会失败,需要强行指定安装的版本号,命令行如下:

pip install pygame==2.1.3.dev8

在pycharm中依次点击File--settings...--你的项目名称--Python Interpreter,右侧窗口中会显示你的项目的虚拟环境中安装的所有包,点页面中的“ ”,在弹出窗口左上角搜索框输入pygame,默认安装版本是2.1.2,选中右下角Specify version选项,默认指定2.1.3.dev8,最后点Install即可成功安装。

pycharm中安装pygame界面


一、pygame的常见方法

1、init方法

用来对pygame的所有元素进行初始化,使用pygame创建游戏窗口必须首先调用init方法。

格式:pygame.init()

2、quit

用来退出pygame图形模式,一般跟init配套使用,在程序结束之前必须调用quit方法。

格式:pygame.quit()

3、Rect类

用来创建矩形区域对象,该对象拥有位置坐标、宽高尺寸等属性,可以方便地控制其里面图像的显示位置和大小等因素。

格式:pygame.Rect(left,top,width,height)

pygame.Rect((left,top),(width,height))

本着由浅入深的原则,也是为了便于理解吸收,在这里只介绍这几个必须用到的方法。


二、pygame的模块介绍

pygame模块概览:

模 块

作 用

cdrom

管理cdrom设备和音频播放

cursors

加载光标形状

display

管理显示窗口

draw

绘制图形(点、线、形状)

event

管理鼠标和键盘等产生的事件

font

加载字体

image

加载和保存图像

joystick

管理游戏手柄装置

key

管理键盘行为

mouse

管理鼠标行为

movie

mpeg电影播放

sndarray

数字处理声音

surfarray

数字处理声音

time

控制时间

transform

变换图像(缩放、旋转和翻转)

这里介绍几个常用模块的用法,如下:

1、display模块

该模块的作用是管理显示窗口,用来创建窗口、设置窗口标题、更新窗口显示内容和图像绘制等,是pygame里最重要的模块。

格式:screen = pygame.display.set_mode(size=(width,height),flags=0,depth=0)

size代表创建窗口的尺寸(宽和高),元组类型;flags是标志位,depth是颜色位深,目前用不到,暂不介绍。

★ 创建的窗口有一个重要方法,就是绘制图像blit方法,简单格式如下:

格式:screen.blit(图片对象,(left,top))

格式:pygame.display.set_caption(title)

格式:pygame.display.update()——主要用于非双缓冲,可进行局部区域的更新

  • pygame.display.flip()——主要用于双缓冲,也可在非双缓冲下正常工作
  • 注意:完成创建窗口、设置相关属性和图像绘制等所有操作后,必须调用更新窗口方法,否则窗口上不会显示预定操作的内容,通常使用update方法来更新窗口内容。为了减少内存占用和节省代码,通常先把所有窗口及图像操作的代码写完后,在最后写一行更新窗口语句。

    2、image模块

    image模块用来加载和保存图片,主要是将需要用到的图片加载到内存中以备后面使用。

    格式:image对象 = pygame.image.load(图片地址)

    3、time模块

    time模块里有一个重要的类就是Clock时钟类,用来创建一个时钟对象,时钟对象用来调整窗口画面显示的帧率,即刷新率。

    格式:clock = pygame.time.Clock()

    ★ 通常游戏的帧率可以设置为60,即每秒刷新60次,让游戏画面看起来更加顺畅

    格式:clock.tick(60)

    4、event模块

    event模块用来监听鼠标和键盘操作,这是游戏里人机交互的重要手段。

    格式:pygame.event.get()

    上面语句是用来得到所有监听来的事件,结果是一个列表,可以通过遍历事件列表来完成相关操作。


    三、飞机大战游戏编写实战

    上面已经简要介绍了pygame的基本情况,现在开始使用pygame的模块和方法构建游戏框架,并逐步增添内容和功能,看看最后能够实现怎样的效果。

    1、创建窗口及主要元素

    import pygame # 初始化pygame图形模式 pygame.init() # 使用display模块创建游戏窗口,窗口尺寸为470*758 screen = pygame.display.set_mode((470, 758)) # 设置窗口标题 pygame.display.set_caption('飞机大战V1.0') # 使用image模块的load方法加载背景图片到内层中 bg = pygame.image.load(r'images\background.jpg') # 加载飞机图片到内层中 plane = pygame.image.load(r'images\plane.png') # 在游戏窗口坐标为(0,0)即左上角处开始绘制背景图片 screen.blit(bg, (0, 0)) # 在游戏窗口坐标为(177,600)处绘制飞机图片 screen.blit(plane, (177, 600)) # 使用display模块的update方法更新图形窗口 pygame.display.update() # 设置无限循环,否则程序顺序执行完毕,窗口画面一闪而过 while True: pass # 退出pygame图形模式 pygame.quit()

    以上代码都是介绍过的pygame的基本方法和模块,为了便于观看,这里暂时使用了无限循环语句,避免程序瞬间执行完毕。

    另外要事先准备好所需要的图片素材,例如背景图片、己方飞机图片和敌方飞机图片等等。除了背景图片之外,其余所有图片基本上都要求是png格式的背景透明图片,需要自己制作,素材图片放置在项目目录下的images文件夹中。

    这段代码构建了飞机大战游戏界面的雏形,如果不添加绘制背景图片和飞机图片的那几行代码,创建的将是一个470*758的黑屏窗口,这也是使用pygame模块创建图形界面的基本流程。下面看一下运行效果:

    2、让飞机动起来

    为了更方便地控制飞机图片的显示位置,下面使用pygame的Rect类创建一个矩形区域对象,让飞机图片绘制在这个矩形区域内,然后通过不断更改矩形区域对象坐标的办法,让飞机图片形成移动的动画效果。同时,为了让这种动画效果看起来更顺畅,我们采用pygame.time模块里的Clock类创建一个时钟,用来控制动画帧率。代码如下:

    import pygame # 初始化pygame图形模式 pygame.init() # ★★★注意这里创建了时钟对象★★★ # 创建一个时钟对象,用来控制游戏屏幕刷新率,也就是帧率 clock = pygame.time.Clock() # 使用display模块创建游戏窗口,窗口尺寸为470*758 screen = pygame.display.set_mode((470, 758)) # 设置窗口标题 pygame.display.set_caption('飞机大战V1.0') # 使用image模块的load方法加载背景图片到内层中 bg = pygame.image.load(r'images\background.jpg') # 加载飞机图片到内层中 plane = pygame.image.load(r'images\plane.png') # 在游戏窗口坐标为(0,0)即左上角处开始绘制背景图片 screen.blit(bg, (0, 0)) # ★★★这里创建了矩形区域对象★★★ # 创建矩形区域对象,用来显示己方飞机图片 plane_rect = pygame.Rect(177, 600, 112, 111) # 设置移动步长 step = 2 while True: # ★★★这里设置了时钟频率,即动画帧率★★★ # 设置时钟帧率为60,即每秒钟执行60次 clock.tick(60) # 重新绘制背景图片,目的是覆盖一下游戏屏幕,将图片移动位置后的原有影像清除 screen.blit(bg, (0, 0)) # 让矩形区域的横坐标减去步长,循环改变位置 plane_rect.x -= step # 如果飞机移动到了最左边或者最右边,给步长取反,从而改变飞机移动方向 if plane_rect.x <= 0 or plane_rect.x >= (470-112): step = -step # 将飞机图片绘制到矩形区域中 screen.blit(plane, plane_rect) # 所有图片元素都更改完毕后,更新显示窗口 pygame.display.update() # 退出pygame图形模式 pygame.quit()

    重点:这段代码的重点是在循环开始之后,重新绘制背景图片,目的是将飞机图片覆盖掉,接着飞机在新位置又重新显示,循环往复,飞机就动起来了!如果没有重绘背景这一步,那么在飞机运动的横坐标上会产生无数个飞机图像。以上代码运行效果如下:

    3、增加关闭窗口功能

    以上代码运行时是一个死循环,因为没有关闭程序的操作,下面使用pygame的event模块来获取程序运行过程中产生的所有事件,然后遍历事件列表,通过判断鼠标点击关闭按钮事件来关闭窗口,结束程序运行。添加的事件检测部分代码如下:

    # 获取全部事件,并遍历判断,如果是点击退出按钮事件,则执行退出操作 for event in pygame.event.get(): if event.type == pygame.QUIT: print('退出游戏...') # 退出pygame图形模式 pygame.quit() # 这里使用exit直接退出程序,而不使用break中断循环 # 可能因为有时钟的关系,使用break中断循环后,还会再执行一次绘图操作, # 但上面已经退出了pygame图形模式,所以会有一个报错 exit()

    以上代码中,使用pygame.event.get()这个语句获取事件列表,然后使用for循环进行遍历,如果有pygame.QUIT这个事件,则退出程序。到这里,终于摆脱了死循环,现在是一个顺畅的动画,还不能控制飞机产生相应动作,需要进一步添加键盘监听事件及相应代码来完成控制飞机的功能。

    未完,待续!在第二篇里继续完善!

    查看全文
    大家还看了
    也许喜欢
    更多游戏

    Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved