目录
一.Pygame程序基本搭建过程
1.初始化化程序
2.创建Surface对象
3.事件监听
4.游戏循环
二.Pygame Display显示模块详解
1.将Surface对象粘贴至主窗口上
2.设置窗口主窗口
3.填充主窗口背景,参数值RGB
4.设置窗口标题
5.更新屏幕内容
6.pygame.display其他方法
三.Pygame Surface创建图像
1.Surface模块创建图像
2.Surface从外部加载图像
四.Pygame Transform图像变形
五.Pygame Time时间控制
1.游戏暂停
2.设置游戏的帧数率(FPS)
六.Pygame Rect区域位置
七.Pygame Event事件模块
1.事件类型
2.事件处理方法
3.处理键盘事件
4.处理鼠标事件
八.Pygame Dra绘图函数
1.绘制矩形
2.绘制多边形
3.绘制圆形
4.绘制椭圆形
5.绘制圆弧曲线
6.绘制直线
九.字体绘制
十.音频播放
一.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参数如下:
标志位 | 功能 |
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 pygameimport syspygame.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 pygameimport syspygame.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图像变形
方法 | 说明 |
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 pygamepygame.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 pygamepygame.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 pygamepygame.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 |
ATIVEEVENT | Pygame被激活或者隐藏 | 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 |
VIDEORESIZE | pygame窗口缩放 | size,w,h |
VIDEOEXPOSE | Pygame窗口部分公开 | 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_9 | 0~9 |
K_a~k_z | a~z |
K_DELETE | 删除键(delete) |
K_KP0~K_KP9 | 小键盘的0~9 |
K_F1~K_F15 | F1~F15 |
K_UP | 向上箭头 |
K_DOWN | 向下箭头 |
K_RIGHT | 向右箭头 |
K_LEFT | 向左箭头 |
KMOD_ALT | 同时按下Alt键 |
4.处理鼠标事件
事件 | 说明 |
MOUSEMOTION | 鼠标按下 |
MOUSEBUTTONDOWN | 鼠标释放 |
MOUDEBUTTONUP | 鼠标释放 |
import pygamefrom 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.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 pygamefrom 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,sysfrom 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, sysfrom pygame.locals import *# 初始化pygamepygame.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()