Python Pygame 游戏开发核心模块详解

拾光
拾光
发布时间:2026-10-16| 7人浏览过
原创

本文系统讲解 Python Pygame 库的核心用法,涵盖窗口初始化、Surface 对象创建、事件监听机制、图像加载与变换、时间控制及 Rect 区域管理。重点详解 display 显示模块、draw 绘图函数(矩形、多边形、圆形、圆弧、直线)及字体与音频模块,提供完整代码示例与参数说明,帮助开发者快速构建基础游戏框架。

一、Pygame 程序基本搭建过程

使用 Pygame 构建游戏窗口主要包含以下几个关键步骤。

1. 初始化程序

在开始编写 Pygame 代码前,必须对程序进行初始化操作,具体代码如下。

pygame.init()

该代码通常位于程序起始位置,其作用是自动检测 Pygame 软件包状态,并完成包括 display(显示模块)、font(字体模块)、mixer(声音模块)、cursors(光标控制模块)等在内的多个子模块的初始化工作。

2. 创建 Surface 对象

Surface 是 Pygame 中的核心窗口界面概念,类似于画布,图像和文本均可显示在 Surface 对象上。创建方式主要有以下几种。

(1)创建基础 Surface 对象:

#也可以叫做screen对象,本质上是一个Surface对象
screen = pygame.display.set_mode(400,400)

(2)创建包含文本的 Surface 对象:

#创建一个包含文字的Surface对象
text = f.render("小马哥不马虎",True,(255,255,255),(0,0,0))
#通过blit方法将其绘制出来,textRect表示位置坐标
screen.blit(text,textRect)

(3)创建包含图像的 Surface 对象:

surface_image = pygame.image.load("图片路径")

3. 事件监听

优秀的游戏离不开用户交互,通过事件机制,玩家可以根据自身意愿与游戏进行互动。

以下是一个实现关闭游戏功能的简单交互示例:

#所有get()获取事件
for event in pygame.event.get():
    #判断事件类型
    if event.type == pygame.QUIT:
        pygame.quit()

4. 游戏循环

核心代码逻辑如下:

while True:
    for event in pymage.event.get():
        if event.type == pygame.QUIT:
            pymage.quit()
            sys.exit()
    #更新并绘制屏幕内容
    pygame.display.flip()

二、Pygame Display 显示模块详解

Pygame 通过 pygame.display 显示模块中的方法来创建游戏的主窗口。

函数格式如下:

screen = pygame.display.set_mode(size=(), flags=0)

·size:用于设定窗口的宽度和高度。

·flags:功能标志位,用于指定创建的主窗口样式,具体 flags 参数说明如下:

flags 参数详解

标志位功能
pygame.FULLSCREEN创建一个全屏窗口
pygame.HWSURFACE创建一个硬件加速窗口,必须和FULLSCREEN同时使用
pygame.OPENGL创建一个OPENGL渲染窗口
pygame.RESIZABLE创建一个可以改变大小的窗口
pygame.DOUBLEBUF创建一个双缓冲窗口,建议在HWSURFACE或OPENGL时使用
pygame.NOFRAME创建一个没有边框的窗口

1. 将 Surface 对象粘贴至主窗口

相关代码如下:

scrren.blit(source, dest, area=None, special_flage=0)

·source:表示要粘贴的 Source Surface 对象。

·dest:主窗口中用于标识位置的坐标。

·area:接受一个 Rect 对象,默认为 None。若提供此参数,则相当于执行抠图操作,仅在屏幕指定位置显示感兴趣的内容区域。

·special_flags:可选参数,用于指定该位置颜色的混合方式。

2. 设置窗口主窗口

screen = pygame.display.set_mode(400,400)

3. 填充主窗口背景,参数值为 RGB 颜色值。

screen.fill((156,156,156))

4. 设置窗口标题。

pygame.display.set.caption('小马哥不马虎')

5. 更新屏幕内容以显示最新状态。

pygame.display.flip()

6. pygame.display 其他辅助方法。

方法名称说明
pygame.display.get_surface()获取当前显示的Surface对象
pygame.display.flip()更新整个待显示的Surface对象到屏幕上
pygame.display.update()更新部分软件界面显示
pygame.display.lnfo()产生一个VideInfo对象,包含了显示界面的相关信息
pygame.display.set_icon()设置左上角的游戏图标,图标尺寸大小为32*32
pygame.display.iconify()将显示的主窗口即Surface对象最小化,或者隐藏
pygame.display.get_active()当前显示界面显示在屏幕上时返回True,如果窗口被隐藏和最小化时则返回False

三、Pygame Surface 创建图像

1. 使用 Surface 模块创建图像

语法格式如下:

Surface = pygame.Surface(size=(width, height), flags, depth)

·size:表示 Surface 对象的矩形区域大小。

·flags:功能标志位,有两个可选参数值 HWSURFACE 和 SPCALPHA。前者代表将创建的 Surface 对象存放于显存中,后者表示让图像的每一个像素包含一个 alpha 通道(透明度)。

·depth:指定像素的颜色深度,默认为自适应模式,由 Pygame 自动调节。

代码实例:

import pygame
import sys
 
pygame.init()
#设置主窗口
screen = pygame.display.set_mode((400,400))
screen.fill('blue')
#设置窗口标题
pygame.display.set_caption('小马哥不马虎')
#创建一个图像
face = pygame.Surface((60,60),flags=pygame.HWSURFACE)
#填充图像
face.fill(color='pink')
while True:
    for event in pygame.event.get():
        if event.type==pygame.QUIT:
            pygame.quit()
            sys.exit()
    #将图像添加到主屏幕上
    screen.blit(face,(100,100))
    #更新屏幕内容
    pygame.display.flip()

效果:

2. 从外部加载图像到 Surface

语法格式如下:

pygame.image.load('图片路径').convert()

代码实例:

import pygame
import sys
 
pygame.init()
#设置主窗口
screen = pygame.display.set_mode((400,400))
screen.fill('white')
#设置窗口标题
pygame.display.set_caption('小马哥不马虎')
#加载图片
image_surface = pygame.image.load('C:/Users/myun/Pictures/不知火舞.jpg')
image_surface.fill((0,0,255),rect=(100,100,100,50),special_flags=0)
image_surface.scroll(100,60)  #移动图片
while True:
    for event in pygame.event.get():
        if event.type==pygame.QUIT:
            pygame.quit()
            sys.exit()
    #将图像添加到主屏幕上
    screen.blit(image_surface,(0,0))
    #更新屏幕内容
    pygame.display.flip()

效果图:

Surface 模块处理图像的常用方法汇总。

方法说明
pygame.Surface.blit()将一个图像绘制到另一个图像上
pygame.Surface.convert()修改图像的格式
pygame.Surface.fill()使用纯色填充Surface图像
pygame.Surface.scroll()复制并移动Surface对象
pygame.Surface.set_alpha()设置整个图像的透明度
pygame.Surface.get_at()获取一个像素的颜色值
pygame.Surface.set_at()设置一个像素的颜色值
pygame.Surface.get_palette()获取Surface对象8位索引的调色板
pygame.Surface.map_rgb()将一个RGBA颜色转换为映射的颜色值
pygame.Surface.set_clip()设置该Surface对象的剪切区域
pygame.Surface.subsurface()根据父对象创建一个新的子Surface对象
pygame.Surface.get_offset()获取子Surface对象在父对象中的偏移量
pygame.Surface.get_size()获取Surface对象的大小

四、Pygame Transform 图像变形

Transform 方法用于处理图像的缩放、旋转等变形操作。

方法说明
pygame.transform.scale()将图片缩放至指定的大小,并返回一个新的Surface对象
pygame.transform.rotate()将图片旋转至指定角度
pygame.transform.rotozoom()以角度旋转图像,同时将图像缩小或放大至指定的倍数

五、Pygame Time 时间控制

1. 游戏暂停

Pygame.time 模块提供以下常用方法用于时间控制。

方法说明
pygam.time.get_ticks()以毫秒为单位获取时间
pygame.time.wait()使程序暂停一段时间
pygame.time.set_time()创建一个定时器,即每隔一段时间就去执行一些动作
pygame.time.Clock()创建一个时间对象来帮助我们确定游戏要以多大的帧数运行

代码实例:

import pygame
pygame.init()
screen =pygame.display.set_mode((500,400))
pygame.display.set_caption('时间设置')
#获取时间
t=pygame.time.get_ticks()
#暂停游戏3000毫秒
t1=pygame.time.wait(3000)
print(t1)
image_surface=pygame.image.load('C:/Users/myun/Pictures/不知火舞.jpg')
while True:
    for event in pygame.event.get():
        if event.type==pygame.QUIT:
            exit()
        screen.blit(image_surface,(0,0))
        pygame.display.update()

效果:三秒后加载图片。

2. 设置游戏的帧数率 (FPS)

Clock() 方法可以实现对游戏帧数的精确设置。

方法说明
pygame.time.Clock.tick()更新clock对象
pygame.time.Clock.get_time()获取上一个tick中的时间
pygame.time.Clock.get_fps()计算clock对象的帧数

代码实例:

import pygame
pygame.init()
screen =pygame.display.set_mode((500,400))
pygame.display.set_caption('时间设置')
#获取时间
t=pygame.time.get_ticks()
#暂停游戏3000毫秒
t1=pygame.time.wait(3000)
print(t1)
image_surface=pygame.image.load('C:/Users/myun/Pictures/不知火舞.jpg')
#创建时间对象
clock = pygame.time.Clock()
while True:
    #通过时间对象指定循环帧数,每秒循环60次
    clock.tick(60)
    for event in pygame.event.get():
        if event.type==pygame.QUIT:
            exit()
        screen.blit(image_surface,(0,0))
        pygame.display.update()

注:游戏帧数仅在动态图像或动画中显现出来。

六、Pygame Rect 区域位置

Rect() 方法用于创建一个指定位置和指定大小的矩形区域。

语法格式如下:

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

代码实例:

import pygame
pygame.init()
screen = pygame.display.set_mode((500,300))
pygame.display.set_caption('小马哥不马虎')
image_surface = pygame.image.load("C:/Users/myun/Pictures/bg.jpg")
rect1 = pygame.Rect(50,50,100,100)
# 在原图的基础上创建一个新的子图(surface对象)
image_child= image_surface.subsurface(rect1)
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            exit()
    #在屏幕上显示子图的区域
    screen.blit(image_child,rect1)
    pygame.display.update()

效果:在图片上截取了一个和 Rect1 同样大小的矩形区域。

Rect 的其他常用方法汇总。

方法说明
pygame.Rect.copy()复制矩形
pygame.Rect.move()移动矩形区域,接受一个列表参数
pygame.Rect.move_ip()移动矩形(无返回)
pygame.Rect.inflate()增大或缩小矩形
pygame.Rect.clamp()将矩形移动到另一个矩形内
pygame.Rect.union()返回两个矩形合并后的矩形
pygame.Rect.fit()按横纵比调整矩形或移动矩形
pygame.Rect.contains()测试一个矩形是否在另个矩阵内
pygame.Rect.collidepoint()测试点是否在矩形中
pygame.Rect.colliderect()测试两个矩形是否重叠

七、Pygame Event 事件模块

1. 事件类型

通过识别不同的事件类型,可以有序地、逐一地处理用户的操作输入。

事件类型详解

事件类型描述成员属性
        QOUIT用户按下窗口的关闭按钮none
ATIVEEVENTPygame被激活或者隐藏

gain,state

 KEYDOWN键盘按下unicode,key,mod
KEYUP键盘释放key,mod
MOUSEMOTION鼠标移动pos,rel,button
MOUSEBUTTONDOWN鼠标按下pos,button
MOUSEBUTTONUP鼠标放开pos,button
JOYAXISMOTION游戏手柄(Joystick or pad)移动joy,axis,value
JOYBALLMOTION游戏球(Joy  ball)移动joy,axis,value
JOYHATMOTION游戏手柄(Joystick)移动joy,axis,value
JOYBUTTONDOWN游戏手柄按下joy,button
JOYBUTTONUP游戏手柄放开joy,button
VIDEORESIZEpygame窗口缩放size,w,h
VIDEOEXPOSEPygame窗口部分公开none
USEREVENT触发一个用户事件事件代码

2. 事件处理方法

Pygam.event 模块提供了处理事件的常用方法,具体如下:

方法说明
pygame.event.get()从事件队列获取一个事件,并在事件队列中删除该事件
pygame.event.wait()阻塞直至事件发生才会继续执行,若没有事件发生将一直处于阻塞状态
pygame.event.set_blocked()控制哪些事件禁止进入队列,如果参数值为None,则表示禁止所有事件进入
pygame.event.pump()调用该方法后,Pygame会自动处理事件队列
pygame.event.poll()会根据实际情况返回一个真实的事件,或者一个None
pygame.event.peek()检测某类事件是否在队列中
pygame.event.clear()从队列中清除所有的事件
pygame.event.get_blocked()检测某一类型的事件是否被禁止进入队列
pygame.event.post()放置一个新的事件在队列中
pygame.event.Event()创建一个用户自定义的事件
pygame.event.set_allowed()控制哪些事件允许进入队列

3. 处理键盘事件

键盘事件通过一个 key 属性来标识,通过该属性可以获取键盘的按键状态。以下是键盘按键的常量定义:

常量名描述
K_BACKSPACE

退格键(Backspace)

K_TAB制表键(Tab)
K_CLEAR清除键(Clear)
K_RETURN回车键(Enter)
K_PAUSE暂停键(Pause)
K_ESCAPE退出键(Escape)
K_SPACE

空格键(Space)

K_0~K_90~9
K_a~k_za~z
K_DELETE

删除键(delete)

K_KP0~K_KP9

小键盘的0~9

K_F1~K_F15F1~F15
K_UP向上箭头
K_DOWN向下箭头
K_RIGHT向右箭头
K_LEFT向左箭头
KMOD_ALT同时按下Alt键

4. 处理鼠标事件

事件说明
MOUSEMOTION鼠标按下
MOUSEBUTTONDOWN鼠标释放
MOUDEBUTTONUP鼠标释放
import pygame
from random import randint
# 初始化程序
pygame.init()
screen = pygame.display.set_mode((450,400))
# 更新显示
pygame.display.flip()
while True:
    #等待事件发生
    event = pygame.event.wait()
    if event.type == pygame.QUIT:
        exit("成功退出")
    if event.type == pygame.MOUSEBUTTONDOWN:
        # pos 获取鼠标当前位置
        print('鼠标按下',event.pos)
        mx,my = event.pos
        # 调用 pygame.draw 模块画圆
        pygame.draw.circle(screen,(255,255,0),(mx,my),50)
        # 处理完,更新显示
        pygame.display.update()
    if event.type == pygame.MOUSEBUTTONUP:
        print('鼠标弹起')
        pass
    if event.type == pygame.MOUSEMOTION:
        print('鼠标移动')
        mx, my = event.pos
        # 随机生成 RGB 颜色值
        r = randint(0,255)
        g = randint(0,255)
        b = randint(0,255)
        pygame.draw.circle(screen, (r,g,b,),(mx, my), 50)
        # 处理完,更新显示
        pygame.display.update()

八、Pygame Dra 绘图函数

1. 绘制矩形

语法格式如下:

pygame.draw.rect(surface, color, rect, width)

·surface:指主窗口或目标 Surface 对象。

·color:该参数用于图形着色,指定颜色值。

·rect:绘制图形的位置和大小,通常由 Rect 对象指定。

·width:可选参数,指定边框的宽度,默认为 0,表示填充该矩形区域。

注:当 width > 0 时,表示绘制线框的宽度;而 width < 0 时,此时不会绘制任何图形。

2. 绘制多边形

语法格式如下:

pygame.draw.polygon(surface, color, points, width)

其余参数与上面相同,points 表示组成多边形的多个 (x, y) 坐标点列表。

3. 绘制圆形

语法格式如下:

pygame.circle(surface, color, pos, radius, width=0)

·pos:该参数用来指定圆心的位置坐标。

·radius:用来指定圆的半径。

4. 绘制椭圆形

语法格式如下:

pygame.draw.ellipse(surface, Rect, width=0)

5. 绘制圆弧曲线

语法格式如下:

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

·start_angle:该段圆弧的起始角度。

·stop_angle:终止角度。

6. 绘制直线

语法格式如下:

一条直线:

pygame.draw.line(surface,color,start_pos,end_pos,width=1)

·start_pos 和 end_pos:表示线段的起始位置和结束位置 (x, y)。

·width=1:表示直线的宽度,默认为 1。

一条消除锯齿的平滑线:

pygame.aaline(surface,color,start_pos,end_pos,blend=1)

多条直线:

pygame.line(surface,color,closed,pointlist,width=1)

·pointlist:参数列表,包含了一系列点坐标的列表。

·closed:布尔参数,如果设置为 True,表示直线的第一个端点和直线的最后一个端点要首尾相连。

多条抗锯齿直线:

pygame.draw.aalines(surface,color,closed,pointlist,blend=1)

绘图方法总汇:

pygame.draw 模块绘图方法汇总。

方法说明
pygame.draw.rect()绘制矩阵
pygame.draw.polygon()绘制多边形
pygame.draw.circle()根据圆心和半径绘制圆形
pygame.draw.ellipse()绘制一个椭圆形
pygame.draw.arc()绘制弧线
pygame.draw.line()绘制线段
pygame.draw.ines()绘制多条连续的线段
pygame.draw.aaline()绘制一条平滑的线段(抗锯齿)
pygame.draw.aalines()绘制多条连续的线段

代码实例:

import pygame
from math import pi
#初始化
pygame.init()
# 设置主屏幕大小
size = (500, 450)
screen = pygame.display.set_mode(size)
# 设置一个控制主循环的变量
done = False
#创建时钟对象
clock = pygame.time.Clock()
while not done:
    # 设置游戏的fps
    clock.tick(10)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            done = True  # 若检测到关闭窗口,则将done置为True
    # 绘制一条宽度为 3 的红色对角线
    pygame.draw.line(screen, (0, 255, 0), [0, 0], (500, 450), 3)
    # 绘制多条蓝色的直线(连续直线,非抗锯齿),False 表示首尾不相连
    pygame.draw.lines(screen, (0, 0, 255), False, [[0, 80], [50, 90], [200, 80], [220, 30]], 1)
    # 绘制一个灰色的矩形区域,以灰色填充区域
    pygame.draw.rect(screen, (155, 155, 155), (75, 10, 50, 20), 0)
    # 绘制一个线框宽度为2的矩形区域
    pygame.draw.rect(screen, (0, 0, 0), [150, 10, 50, 20],2)
    # 绘制一个椭圆形,其线宽为2
    pygame.draw.ellipse(screen, (255, 0, 0), (225, 10, 50, 20), 2)
    # 绘制一个实心的红色椭圆形
    pygame.draw.ellipse(screen, (255, 0, 0), (300, 10, 50, 20))
    # 绘制一个绿色边框(宽度为2)三角形
    pygame.draw.polygon(screen, (100, 200, 45), [[100, 100], [0, 200], [200, 200]], 2)
    # 绘制一个蓝色实心的圆形,其中[60,250]表示圆心的位置,40为半径,width默认为0
    pygame.draw.circle(screen, (0, 0, 255), [60, 250], 40)
    # 绘制一个圆弧,其中0表示弧线的开始位置,pi/2表示弧线的结束位置,2表示线宽
    pygame.draw.arc(screen, (255, 10, 0), (210, 75, 150, 125), 0, pi / 2, 2)
    # 刷新显示屏幕
    pygame.display.flip()
# 点击关闭,退出pygame程序
pygame.quit()

效果图:

九、字体绘制

font 模块可以绘制字体文本。

·pygame.font.Font(filename, size):获取字体对象。

·pygame.font.Font.render(text, antialias, color, background=None):显示字体。

·get_rect():获取坐标对象。

实例:

import pygame,sys
from pygame.locals import *
 
pygame.init()
 
surface = pygame.display.set_mode((500, 400), 0, 32)
pygame.display.set_caption("文字绘制")
surface.fill((255, 255, 255))
 
# 获取字体对象,可以获取系统自带的,也可以自定义字体
fonts = pygame.font.get_fonts()
fonts = 'fonts/ARBERKLEY.ttf'
basicFont = pygame.font.SysFont(fonts, 50)
 
# surface对象
text = basicFont.render('这是一串字符', True, (255,255,255), (0,255,0))
 
# 设置文本位置
textRect = text.get_rect()
 
textRectObj.center = (250, 200)
 
# 将渲染的surface对象更新到屏幕上
surface.blit(text,textRect)
 
# 程序主循环
while True:
 
  # 获取事件
  for event in pygame.event.get():
    # 判断事件是否为退出事件
    if event.type == QUIT:
      # 退出pygame
      pygame.quit()
      # 退出系统
      sys.exit()
 
  # 绘制屏幕内容
  pygame.display.update()

十、音频播放

mixer 音频模块用于处理声音。

·pygame.mixer.Sound(filename):播放特效音。

·pygame.mixer.music.load(filename):加载背景音乐。

代码实例:

import pygame, sys
from pygame.locals import *
 
# 初始化pygame
pygame.init()
 
# 设置窗口的大小,单位为像素
screen = pygame.display.set_mode((500, 400))
 
# 设置窗口的标题
pygame.display.set_caption('音频播放')
 
# 设置背景
screen.fill((255, 255, 255))
 
# 加载并播放一个特效音频文件
sound = pygame.mixer.Sound('C:/Users/myun/Music/狙击枪.wav')
sound.play()
 
# 加载背景音乐文件
pygame.mixer.music.load('C:/Users/myun/Music/Oh The Larceny - Light That Fire.mp3')
 
# 播放背景音乐,第一个参数为播放的次数(-1表示无限循环),第二个参数是设置播放的起点(单位为秒)
pygame.mixer.music.play(-1, 0.0)
 
# 程序主循环
while True:
    # 获取事件
    for event in pygame.event.get():
        # 判断事件是否为退出事件
        if event.type == QUIT:
            # 停止播放背景音乐
            pygame.mixer.music.stop()
            # 退出pygame
            pygame.quit()
            # 退出系统
            sys.exit()
 
    # 绘制屏幕内容
    pygame.display.update()

总结

到此这篇关于 python 游戏库 pygame 经典教程的文章就介绍到这了,更多相关 python 游戏库 pygame 内容请搜索本站以前的文章或继续浏览下面的相关文章,希望大家以后多多支持本站!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。