python游戏库pygame经典教程(推荐!)

 更新时间:2022年12月06日 12:01:40   作者:小马哥不马虎  
Python Pygame是一款专门为开发和设计 2D 电子游戏而生的软件包,是入门级游戏开发库,下面这篇文章主要给大家介绍了python游戏库pygame经典教程的相关资料,需要的朋友可以参考下

一.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:表示要粘贴的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对象的矩形区域大小

·flage:功能标志位,有两个可选参数值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:指主窗口

·color:该参数用于图形着色

·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使用PIL剪切和拼接图片

    python使用PIL剪切和拼接图片

    这篇文章主要为大家详细介绍了python使用PIL剪切和拼接图片,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-03-03
  • python日志记录模块实例及改进

    python日志记录模块实例及改进

    许多应用程序中都会有日志模块,用于记录系统在运行过程中的一些关键信息,以便于对系统的运行状况进行跟踪。在python中,我们不需要第三方的日志组件,因为它已经为我们提供了简单易用、且功能强大的日志模块:logging。
    2017-02-02
  • 一文带你弄懂Python3中的def __init__

    一文带你弄懂Python3中的def __init__

    说起基础的init函数也是我们的老朋友了,组合函数的要么是理解又一定的难度,要么是操作方法有复杂的地方,小编今天要讲的def __init()__属于第一种,下面这篇文章主要给大家介绍了关于如何通过一文带你弄懂Python3中的def __init__的相关资料,需要的朋友可以参考下
    2022-12-12
  • Opencv实现鼠标事件与窗口互动功能过程

    Opencv实现鼠标事件与窗口互动功能过程

    平时在做图像处理demo或者研究测试算法时,经常会用到imshow和鼠标的交互,比如在显示图像的窗口上画点、线、圆、矩形、多边形等操作,故在此做出用法总结
    2022-12-12
  • 利用Python自制网页并实现一键自动生成探索性数据分析报告

    利用Python自制网页并实现一键自动生成探索性数据分析报告

    这篇文章主要介绍了利用Python自制了网页并实现一键自动生成探索性数据分析报告,文章内容具有一定的参考价值,需要的小伙伴可以参考一下
    2022-05-05
  • 浅谈Python中的函数(def)及参数传递操作

    浅谈Python中的函数(def)及参数传递操作

    这篇文章主要介绍了浅谈Python中的函数(def)及参数传递操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-05-05
  • Python使用requests提交HTTP表单的方法

    Python使用requests提交HTTP表单的方法

    今天小编就为大家分享一篇Python使用requests提交HTTP表单的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-12-12
  • 使用python求解二次规划的问题

    使用python求解二次规划的问题

    今天小编就为大家分享一篇使用python求解二次规划的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-02-02
  • python [:3] 实现提取数组中的数

    python [:3] 实现提取数组中的数

    今天小编就为大家分享一篇python [:3] 实现提取数组中的数,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-11-11
  • 跟老齐学Python之永远强大的函数

    跟老齐学Python之永远强大的函数

    Python程序中的语句都会组织成函数的形式。通俗地说,函数就是完成特定功能的一个语句组,这组语句可以作为一个单位使用,并且给它取一个名字,这样,我们就可以通过函数名在程序的不同地方多次执行(这通常叫做函数调用),却不需要在所有地方都重复编写这些语句。
    2014-09-09

最新评论