Python 升级之路( Lv12 ) Pygame游戏开发基础

2022-09-08 20:26:35 浏览数 (1)

Pygame游戏开发基础

  • Python系列文章目录
  • 前言
  • 什么是Pygame
    • Pygame 安装
      • 命令行窗口下载
      • pycharm 环境下安装下载
    • Pygame 框架中的模块
    • 开发第一个 Pygame 程序
    • 常用模块介绍
      • 事件操作
      • 字体处理
      • 绘制图形
      • 实现动画
      • 播放音乐
    • 基于pygame 实现的坦克大战(简单)

前言

本篇博文首先对Pygame进行了介绍和安装, 然后介绍了Pygame 中的子模块以及如何开发简单的 Pygame程序 再然后对 Pygame 五个常用事件进行演示, 最后根据这些常用事件来实现坦克大战游戏


什么是Pygame

Pygame 是一组用于编写视频游戏的 Python 模块. 它具有高度的可移植性,几乎可以在所有平台和操作系统上运行. Pygame 在优秀的 SDL 库之上添加了功能. 这使我们可以使用 python 语言创建功能齐全的游戏和多媒体程序. 官网入口

Pygame 安装

Pygame安装方式大致分为三种:

  • 在命令行利用 pip install 进行安装
  • 通过pycharm 来进行安装
  • 在python官网来下载对应模块

下面主要介绍前两种

命令行窗口下载

  1. Windows R 输入 cmd, 在命令行中输入如下命令: pip install pygame 也可以通过pycharm 进入终端命令行. 然后输入相对应软件进行下载
  1. 安装时可以指定版本 pip install pygame ==版本号 但需要注意, 锁安装的模块版本要和自己当前安装的Python版本进行匹配, 否则可能会下载失败! 因此建议尽量不要指定版本.

pycharm 环境下安装下载

  1. 进入 FIle->setting->project 项目名 -> Python Interpreter-> 输入对应的拓展模块然后下载即可 无需选择版本, 因为pycharm 会为你选择合适的匹配你python 的版本

Pygame 框架中的模块

在 Pygame 框架中有很多模块,其中最常用模块的具体 说明下表所示

模块名

功能说明

pygame.display

访问显示设备

pygame.draw

绘制形状、线和点

pygame.event

管理事件

pygame.font

使用字体

pygame.image

加载和存储图片

pygame.key

读取键盘按键

pygame.mixer

声音

pygame.mouse

鼠标

pygame.movie

播放视频

pygame.music

播放音频

pygame.overlay

访问高级视频叠加

pygame.rect

管理矩形区域

pygame.sndarray

操作声音数据

pygame.sprite

操作移动图像

pygame.surface

管理图像和屏幕

开发第一个 Pygame 程序

步骤: 初始化-> 生成主屏幕 -> 设置标题 -> 刷新屏幕

实操代码

代码语言:javascript复制
import pygame

# 初始化
pygame.init()
# 生成主屏幕(“双缓冲”窗口)
"""
set_mode 函数:会返回一个 Surface 对象,代表了在桌面上出现的那个窗口
在 3 个参数中,第 1 个参数为元组,表示屏幕的大小; 
第 2 个标志位,具体含义如表 1-2 所示,如果不用什么特性,就指定 0; 
第 3 个为色深
"""
pygame.display.set_mode((600, 500), pygame.DOUBLEBUF, 32)
# 设置标题
pygame.display.set_caption("开发第一个pygame程序")
while True:
    # 刷新屏幕
    pygame.display.update()

注意:

  • set_mode 函数:会返回一个 Surface 对象,代表了在桌面上出现的那个窗口 在 3 个参数中,第 1 个参数为元组,表示屏幕的大小; 第 2 个标志位,具体含义如表 1-2 所示, 如果不用什么特性,就指定 0; 第 3 个为色深. 各标志位具体含义如下所示: 标志位含义FULLSCREEN创建一个全屏窗口DOUBLEBUF创建一个“双缓冲”窗口,建议和HWSURFACE 和 OPENGL同时使用 NOFRAME 创建一个没有边框的窗口RESIZEBLE创建一个可以改变大小的窗口OPENGL创建一个 OPENGL 渲染的窗口HWSURFACE创建一个硬件加速的窗口,必须和 FULLSCREEN 同时使用
  • 游戏的主循环是一个无限循环,直到用户退出。在这个主循环里面做的事情就是 第 5 页 不停的刷新新画面。

效果展示

常用模块介绍

事件操作

Pygame 会接受用户的各种操作(比如按键盘,移动鼠标等). 这些操作会产生对应的事件,例如按键盘事件,移动鼠标事件. 事件在软件开发中非常重要,Pygame 把一系列的事件存放在一个队列里,并逐个进行处理

  1. 事件检索 使用函数 pygame.event.get()获取所有的事件,表 1-3 列出了 Pygame 中常用的事件 事件参数产生途径QUITnone用户按下关闭按钮ACTIVEEVENTgain, state激活或者隐藏Pygame KEYDOWNunicode, key, mod按下键KEYUPkey, mod放开键MOUSEMOTIONpos, rel, buttons鼠标移动MOUSEBUTTONUPpos, button放开鼠标键MOUSEBUTTONDOWNpos, button按下鼠标键JOYBUTTONUPjoy, button游戏手柄放开JOYBUTTONDOWNjoy, button游戏手柄按下VIDEORESIZEsize, w, h Pygame窗口缩放VIDEOEXPOSEnone Pygame窗口部分公开(expose)USEREVENTcode触发一个用户事件
  2. 处理鼠标事件 在 Pygame 框架中,MOUSEMOTION 事件会在鼠标动作的时候发生,它有如下所 示 3 个参数 buttons: 一个含有 3 个数字的元组,3 个值分别代表左键、中键和右键,1 就表示 按下. pos: 位置 ; rel: 代表现在距离上次产生鼠标事件时的距离.和MOUSEMOTION 类 似 , 常用的鼠标事件还有 MOUSEBUTTONUP 和 MOUSEBUTTONDOWN 两个
  3. 处理键盘事件 key:按下或者放开的键值,是一个数字,在 Pygame 中可以使用 K_xxx 来表示,比如字母 a 就是 K_a,还有 K_SPACE 和 K_RETURN 等 mod:包含了组合键信息,如果 mod&KMOD_CTRL 是真,表示用户同时按下了 Ctrl 键,类似的还有 KMODE_SHIFT 和 KMODE_ALT。 unicode:代表了按下键对应的 Unicode 值

实操代码

代码语言:javascript复制
import pygame

pygame.init()
pygame.display.set_caption("处理键盘事件")
screen = pygame.display.set_mode((600, 500), 0, 32)
# 加载图片
image = pygame.image.load("img/1.gif")		# 需要在当前包下面父类包下面创建文件夹
# 设置x,y作为初始位置
x, y = 0, 0
# 设置各个方向移动
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:   # 退出(处理了框体右上角x)
            exit()
        if event.type == pygame.KEYDOWN:    # 按下
            if event.key == pygame.K_LEFT:
                x -= 10
            elif event.key == pygame.K_RIGHT:
                x  = 10
            elif event.key == pygame.K_UP:
                y -= 10
            elif event.key == pygame.K_DOWN:
                y  = 10

    screen.fill((0, 0, 0))          # 设置背景颜色
    screen.blit(image, (x, y))      # 填充图像
    pygame.display.update()         # 刷新屏幕

效果展示

字体处理

在 Pygame 模块中可以直接调用系统字体,或者可以直接使用 TTF 字体.

为了使用字体, 需要先创建一个 Font 对象:

代码语言:javascript复制
font = pygame.font.SysFont(‘arial’,18)
  • 在上述代码中,第一个参数是字体名,第二个参数表示大小。
  • 一般来说,“Arial”字体 在很多系统都是存在的,如果找不到,就会使用一个默认字体,这个默认字体和每个操作系统有关 也可以使用 pygame.font.get_fonts()函数来获取当前系统中所有可用的字体
  • 一旦创建了一个 font 对象,就可以通过如下代码使用 render 方法来写字,并且可以显 示到屏幕中.
代码语言:javascript复制
COLOR_RED = pygame.Color(255, 0, 0) 
textSurface = font.render(‘Hello Pygame’,True,COLOR_RED)
  • 在上述代码中,第一个参数是写的文字, 第二个参数是布尔值,它控制是否开启抗锯齿功能,如果设置为 True 字体会比较平滑,不过相应的速度会有一点点影响; 第三个参数是字体的颜色;第四个是背景色,如果你想没有背景色,那么可以不加第四个参数

实操代码

代码语言:javascript复制
import pygame

pygame.init()
# 创建窗口
screen = pygame.display.set_mode((600, 500), 0, 32)
pygame.display.set_caption("测试字体处理")
# 设置字体样式
font = pygame.font.SysFont("kaiti", 20)
# 设置字体颜色
COLOR_RED = pygame.Color(255, 0, 0)
# 设置文本内容
textSurface = font.render('你好世界', True, COLOR_RED)
# 设置文本初始坐标
x, y = 0, 0
# 设置各个方向移动
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:  # 退出(处理了框体右上角x)
            exit()
        if event.type == pygame.KEYDOWN:  # 按下
            if event.key == pygame.K_LEFT:
                x -= 10
            elif event.key == pygame.K_RIGHT:
                x  = 10
            elif event.key == pygame.K_UP:
                y -= 10
            elif event.key == pygame.K_DOWN:
                y  = 10

    screen.fill((0, 0, 0))          	  # 设置背景颜色
    screen.blit(textSurface, (x, y))      # 填充图像
    pygame.display.update()        		  # 刷新屏幕

绘制图形

Pygame 的坐标原点(0,0)点位于左上角,X 轴自左向右,Y 轴自上向下,单位为像素

绘制图形的方法下表

方法名

说明

pygame.draw.line(Surface, color, start_pos, end_pos, width)

绘制一条线段

pygame.draw.aaline(Surface, color, start_pos, end_pos, blend)

绘制一条抗锯齿的线

pygame.draw.lines(Surface, color, closed, pointlist, width)

绘制一条折线

pygame.draw.rect(Surface, color, Rect)

绘制一个矩形

pygame.draw.rect(Surface, color, Rect, width)

绘制一个矩形框

pygame.draw.ellipse(Surface, color, Rect)

绘制一个椭圆

pygame.draw.ellipse(Surface, color, Rect, width)

绘制一个多边形

pygame.draw.arc(Surface, color, Rect, start_angle, stop_angle, width)

绘制一条弧线

pygame.draw.circle(Surface, color, Rect, radius)

绘制一个圆

实操代码

代码语言:javascript复制
from math import pi

import pygame

pygame.init()
screen = pygame.display.set_mode((400, 300))
pygame.display.set_caption(("测试图形绘制"))
# 定义颜色
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)
# 背景颜色
screen.fill(WHITE)
# 绘制一条线
pygame.draw.line(screen, GREEN, [0, 0], [50, 30], 5)
# 绘制一套抗锯齿线
pygame.draw.aaline(screen, GREEN, [0, 50], [50, 80], True)
# 绘制一条折现
pygame.draw.lines(screen, BLACK, False, [[0, 80], [50, 90], [200, 80], [220, 30]], 5)
# 绘制一个空心矩形
pygame.draw.rect(screen, BLACK, [75, 10, 50, 20], 2)
# 绘制一个矩形
pygame.draw.rect(screen, BLACK, [150, 10, 50, 20])
# 绘制一个空心椭圆
pygame.draw.ellipse(screen, RED, [225, 10, 50, 20], 2)
# 绘制一个椭圆
pygame.draw.ellipse(screen, RED, [300, 10, 50, 20])
# 绘制多边形
pygame.draw.polygon(screen, BLACK, [[100, 100], [0, 200], [200, 200]], 5)
# 绘制多条弧线
pygame.draw.arc(screen, BLACK, [210, 75, 150, 125], 0, pi / 2, 2)
pygame.draw.arc(screen, GREEN, [210, 75, 150, 125], pi / 2, pi, 2)
pygame.draw.arc(screen, BLUE, [210, 75, 150, 125], pi, 3 * pi / 2, 2)
pygame.draw.arc(screen, RED, [210, 75, 150, 125], 3 * pi / 2, 2 * pi, 2)
# 绘制一个圆
pygame.draw.circle(screen, BLUE, [60, 250], 40)
# 主程序循环
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:  # 退出(处理了框体右上角x)
            exit()
    # 绘制屏幕内容
    pygame.display.update()

效果展示

实现动画

由于人类眼睛的特殊生理结构,当所看画面的帧率高于 24 的时候,就会认为是连贯的, 此现象称之为视觉暂留 . 帧率(Frame rate)是用于测量显示帧数的量度,所谓的测量单位为每秒显示帧数(Frames per Second,简称:FPS). 在我们原有坐标系的基础上添加偏移量,再重新绘制,依次一张一张的循环绘制下去, 就会得到我们想要的物体移动的效果

Pygame 实现动画主要用到的方法如下表所示

方法名

说明

pygame.image.load(filename)

加载一张图片

pygame.Surface.blit(source, dest, area=None, special_flags = 0)

将图片绘制到屏幕相应坐标上(后面两个参数默认, 可以不传)

pygame.time.Clock()

获得 pygame 的时钟

pygame.time.Clock.tick(FPS)

设置 pygame 时钟的间隔时间

实操代码

代码语言:javascript复制
import sys

import pygame

pygame.init()
# 设置帧率(屏幕每秒刷新次数)
FPS = 60
# 获得pygame的时钟
fpsClock = pygame.time.Clock()
# 设置窗口大小
screen = pygame.display.set_mode((500, 400), 0, 32)
pygame.display.set_caption("测试pygame动画")
# 定义颜色
WHITE = (255, 255, 255)
# 加载图片
img = pygame.image.load("img/1.gif")
# 初始化图片位置
imgx, imgy = 0, 0
# 初始化图片移动方向
direction = "right"

# 程序主循环
# 主程序循环
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:  # 退出(处理了框体右上角x)
            pygame.quit()
            sys.exit()
    # 每次都要重新绘制背景白色
    screen.fill(WHITE)
    # 判断移动的方向, 并对相应的坐标做加减
    if direction == "right":
        imgx  = 5
        if imgx == 380:
            direction = "down"
    elif direction == "down":
        imgy  = 5
        if imgy == 300:
            direction = "left"
    elif direction == 'left':
        imgx -= 5
        if imgx == 10:
            direction = 'up'
    elif direction == 'up':
        imgy -= 5
        if imgy == 10:
            direction = 'right'
    # 该方法将用于图片绘制到相应的坐标中
    screen.blit(img, (imgx, imgy))
    # 刷新屏幕
    pygame.display.update()
    # 设置 pygame 时钟的间隔时间
    fpsClock.tick(FPS)

效果展示

图片会沿着边框四周滚动

播放音乐

在 Pygame 里播放音频有两个方法,一个用来播放特效声音,一个用来播放背景音乐:

  • pygame.mixer.Sound(filename) 该方法返回一个 Sound 对象,调用它的.play( )方法,即可播放较短的音频文件(比如玩家受到伤害、收集到金币等)
  • pygame.mixer.music.load(filename) 该方法用来加载背景音乐,之后调用 pygame.mixer.music.play( )方法就可以播放背景音乐(Pygame 只允许在同一个时刻加载一个背景音乐)

实操代码

代码语言:javascript复制
import sys

import pygame

pygame.init()
# 设置窗口的大小
screen = pygame.display.set_mode((500, 400))
pygame.display.set_caption("测试播放音乐")
# 定义颜色
WHITE = (255, 255, 255)
# 设置背景
screen.fill(WHITE)
# 加载并播放特效音频
sound = pygame.mixer.Sound('img/start.wav')
sound.play()
# 加载背景音乐文件
pygame.mixer.music.load('img/fire.wav')
# 播放背景音乐,第一个参数为播放的次数(-1 表示无限循环),第二个参数是设置播放 的起点(单位为秒)
pygame.mixer.music.play(-1, 0.0)
# 主程序循环
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:  # 退出(处理了框体右上角x)
            # 停止播放背景音乐
            pygame.mixer.music.stop()
            # 退出pygame
            pygame.quit()
            # 退出系统
            sys.exit()
    # 绘制屏幕内容
    pygame.display.update()

基于pygame 实现的坦克大战(简单)

《坦克大战》是由 Namco 游戏公司开发的一款平面射击游戏,于 1985 年发售. 游戏以坦克战斗及保卫基地为主题,属于策略型联机类. 同时也是 FC 平台上少有的内建关卡编辑 器的几个游戏之一

项目相关

  • 代码地址: https://gitee.com/TimePause/mypro01.git
  • 分支名称: dev01-1
  • 代码所在包: mypro01/ com / time / pause / capture2 / tankwar
  • 稳定版. tank25-> v1.0.0, tank26->v1.0.1
  • 打包流程以及打包中的注意事项见下篇博客

0 人点赞