目录
pygame模块
介绍
Python Pygame 是一款专门为开发和设计 2D 电子游戏而生的软件包,它支 Windows、Linux、Mac OS 等操作系统,具有良好的跨平台性。Pygame 由 Pete Shinners 于 2000 年开发而成,是一款免费、开源的的软件包。
Pygame 在 SDL(Simple DirectMedia Layer,使用 C语言编写的多媒体开发库) 的基础上开发而成,它提供了诸多操作模块,比如图像模块(image)、声音模块(mixer)、输入/输出(鼠标、键盘、显示屏)模块等。
功能
绘制图形
显示图片
动画效果
与键盘、鼠标、游戏手柄等外设交互
播放声音
碰撞检测
安装
1. 打开 cmd
2. pip install pygame
如何编写一个游戏的程序
组成
一、初始设置
首先需要导入模块,创建游戏屏幕,然后初始化一些重要的变量
二、游戏循环(意味着游戏正式开始)
当打我们游戏时可能会触发游戏中的各种事件,比如鼠标事件、键盘按键事件、摄像拍照事件等等,因此游戏程序需要一直循环监听玩家的操作,只有当用户点击了游戏“关闭”按钮时,监听才会结束。如果想要达到“循环监听”目的,此时就需要设置一个游戏循环(Game Loop)也称为游戏的主循环,这样才能保证人机交互的体验感。
三、退出程序
当用户想要停止程序的时候,使用一种方式来结束程序
利用pygame模块绘制图形
代码示例:
初始设置:这是整个程序中的第一部分代码,它的作用是自动检测 Pygame 软件包是否正常可用,并检查电脑的硬件调用接口、基础功能是否存在问题,比如音频、光驱、声卡驱动等设备。同时,它会完成 Pygame 中所有模块的初始化操作,比如 display(显示模块)、font(字体模块)、mixer(声音控制模块)、cursors(光标控制模块)等。
import pygame
pygame.init() #初始化pygame
screen=pygame.display.setmode((800,600)) #创建一个显示窗口
pygame.display.set_caption("pygame绘制图形") #设置窗口标题
游戏循环:意味着游戏正式开始
1. 需要设置一个游戏循环(Game Loop)也称为游戏的主循环。
2. 玩家可能有移动和点击鼠标、按下键盘上的技能键,或是滑动手机屏幕等操作,这些操作是为了玩家和程序之间实现人机交互,这些与游戏程序交互的操作被称为事件(Event)。游戏程序需要遍历玩家的所有操作,不同的操作游戏状态都会发生不同的改变,需要及时刷新屏幕上的显示,从而构建出游戏的动态画面效果。当用户点击了游戏“关闭”按钮时,循环才会结束。
while True:
for event in pygame.event.get(): #监听事件(遍历)
if event.type==pygame.QUIT: #退出事件
break
pygame.draw.circle(screen,(255,0,0),(200,300),20) #绘制图形
pygame.display.update() #更新屏幕
退出程序:
当循环结束后,游戏选择退出
pygame.quit()
效果图:
在游戏窗口中加载图片
在游戏中,能够看到的游戏元素大多都是图像。图像文件初始是保存在磁盘上的,如果需要使用,第一步就需要被加载到内存
要在屏幕上看到某一个图像的内容,需要按照三个步骤:
1.使用 pygame.image.load() 加载图像的数据
2.使用游戏屏幕对象,调用 blit方法 将图像绘制到指定位置
3.调用 pygame.display.update() 方法更新整个屏幕的显示
代码示例:
import pygame #导入模块
pygame.init() #pygame模块初始化
#创建一个窗口screen,大小为600*400
screen=pygame.display.set_mode([600,400])
back=pygame.image.load('bj.jpg') #加载背景图像
screen.blit(back,[0,0]) #将背景图画在窗口的[0,0]位置处
img=pygame.image.load('rr.jpg') #加载雪容融图像
screen.blit(img,[100,50])#将雪容融画在窗口的[100,50]位置处
pygame.display.update() #窗口刷新
效果图:
利用循环,让雪容融动起来:
代码示例:
import pygame #导入模块
pygame.init() #pygame模块初始化
#创建一个窗口screen,大小为600*400
screen=pygame.display.set_mode([600,400])
back=pygame.image.load('bj.jpg') #加载背景图像
screen.blit(back,[0,0]) #将背景图画在窗口的[0,0]位置处
img=pygame.image.load('rr.jpg') #加载雪容融图像
screen.blit(img,[100,50])#将雪容融画在窗口的[100,50]位置处
pygame.display.update() #窗口刷新
#在上一代码基础上新增以下代码
for i in range(1,5):
screen.blit(img,[100+i*30,50+i*30]) #不断更改显示位置
pygame.display.update() #更新屏幕
pygame.time.delay(800) #设置两次显示雪容融之间的延时
效果:雪容融出现五次,不符合移动情形
修改:雪容融移动需要完成两个步骤:
①把原来的图像擦掉或覆盖 ②在新的位置上画出图像
代码示例:
import pygame #导入模块
pygame.init() #pygame模块初始化
#创建一个窗口screen,大小为600*400
screen=pygame.display.set_mode([600,400])
back=pygame.image.load('bj.jpg') #加载背景图像
screen.blit(back,[0,0]) #将背景图画在窗口的[0,0]位置处
img=pygame.image.load('rr.jpg') #加载雪容融图像
screen.blit(img,[100,50])#将雪容融画在窗口的[100,50]位置处
pygame.display.update() #窗口刷新
for i in range(1,5):
screen.blit(back,[0,0]) #用背景图覆盖原来的雪容融
screen.blit(img,[100+i*30,50+i*30]) #画出雪容融新的位置
pygame.display.update() #更新屏幕
pygame.time.delay(800) #设置两次显示雪容融之间的延时
在游戏窗口中显示文字
代码示例:
import pygame #导入模块
pygame.init() #pygame模块初始化
#创建一个窗口screen,大小为600*400
screen=pygame.display.set_mode([600,400])
back=pygame.image.load('bj.jpg') #加载背景图像
screen.blit(back,[0,0]) #将背景图画在窗口的[0,0]位置处
img=pygame.image.load('rr.jpg') #加载雪容融图像
screen.blit(img,[100,50])#将雪容融画在窗口的[100,50]位置处
pygame.display.update() #窗口刷新
for i in range(1,5):
screen.blit(back,[0,0]) #覆盖底图
textfont=pygame.font.SysFont('Arial',30) #创建文本对象,Arial,大小30
text="北京"
t=textfont.render(text,True,(255,0,0)) #生成平滑的红色字符串
screen.blit(t,[50,50]) #在窗口显示
screen.blit(img,[100+i*30,50+i*30]) #不断更改显示位置
pygame.display.update() #更新屏幕
pygame.time.delay(800) #设置显示之间的延时
函数介绍:
render(文本内容,是否抗锯齿,字体颜色,字体背景颜色)
运行效果:
在游戏窗口中进行各种操作(即人机交互)
Pygame 会接受用户产生的各种操作(即事件)。事件(Event)是 Pygame 的重要模块之一,它是构建整个游戏程序的核心,比如鼠标点击、键盘敲击、游戏窗口移动、调整窗口大小、触发特定的情节、退出游戏等等,这些都可以看做是“事件”。
遍历事件并改变游戏状态:
for event in pygame.event.get(): #侦听并获取事件列表
if event.type==pygame.QUIT: #接收到退出事件后退出程序
sys.exit()
部分事件如下:
游戏一:雪容融
游戏功能:点击雪容融并显示得分
代码示例:
import pygame #导入模块
import sys
import random
pygame.init() #pygame模块初始化
score=0 #变量初始化
mousex=0
mousey=0
#创建一个窗口screen,大小为600*400
screen=pygame.display.set_mode([600,400])
back=pygame.image.load('bj.jpg') #加载背景图像
img=pygame.image.load('rr.png') #加载雪容融图像
while True:
screen.blit(back,[0,0]) #覆盖底图
textfont=pygame.font.SysFont('SimHei',30) #创建文本对象,Arial,大小30
t=textfont.render('2022北京冬奥助力值'+str(score),True,(255,0,0)) #生成平滑的红色字符串
screen.blit(t,[150,50]) #在窗口显示
x=random.randint(0,400)#随机生成福字水平方向坐标
y=random.randint(0,300)
screen.blit(img,[x,y])#不断更改显示位置
pygame.display.update() #更新屏幕
pygame.time.delay(800) #设置显示之间的延时
for event in pygame.event.get(): #侦听并获取事件列表
if event.type==pygame.QUIT: #接收到退出事件后退出程序
sys.exit()
if event.type==pygame.MOUSEBUTTONDOWN: #侦听到鼠标点击事件
mousex,mousey=pygame.mouse.get_pos() #获取鼠标按下的坐标
#判断鼠标是否击中福字,本例福字宽为100,高为100
if mousex in range(x,x+100) and mousey in range(y,y+100):
score=score+5 #加分
游戏二:碰撞检测
游戏功能:键盘控制移动
游戏截图:
利用x坐标判定是否到达终点
代码示例:
if x<=0:
textfont=pygame.font.SysFont('SimHei',30) #创建文本对象,使用系统自带字体,大小30
t=textfont.render("YOU WIN!",True,(255,0,0)) #生成平滑的红色字符串
screen.blit(t,[150,150]) #在窗口显示
pygame.display.update() #更新屏幕
pygame.time.delay(800)
完整代码:
import pygame #导入模块
import sys
pygame.init() #pygame模块初始化
#创建一个窗口screen,大小为500*300
screen=pygame.display.set_mode([500,300])
back=pygame.image.load('xd.jpg') #加载背景图像
screen.blit(back,[0,0]) #将背景图画在窗口的[0,0]位置处
img=pygame.image.load('xb.png') #加载人物图像
x=450
screen.blit(img,[x,200])#将人物画在窗口的[450,200]位置处
pygame.display.update() #窗口刷新
while True:
if x<=0:
textfont=pygame.font.SysFont('SimHei',30) #创建文本对象,使用系统自带字体,大小30
t=textfont.render("YOU WIN!",True,(255,0,0)) #生成平滑的红色字符串
screen.blit(t,[150,150]) #在窗口显示
pygame.display.update() #更新屏幕
pygame.time.delay(800)
else:
for event in pygame.event.get(): #侦听并获取事件列表
if event.type==pygame.QUIT: #接收到退出事件后退出程序
sys.exit()
if event.type==pygame.KEYDOWN:#键盘是否按下
if event.key==pygame.K_LEFT:#按下左箭头键
x=x-2
elif event.key==pygame.K_RIGHT:#按下右箭头键
x=x+2
screen.blit(back,[0,0]) #覆盖底图
screen.blit(img,[x,200])#不断更改显示位置
textfont2=pygame.font.SysFont('SimHei',30) #创建文本对象,使用系统自带字体,大小30
t2=textfont2.render("全民上冰雪",True,(255,0,0)) #生成平滑的红色字符串
screen.blit(t2,[150,50]) #在窗口显示
textfont3=pygame.font.SysFont('SimHei',20) #创建文本对象,使用系统自带字体,大小30
t3=textfont3.render("加油!你距离终点还有"+str(x)+"米",True,(0,0,0)) #生成平滑红色字符串
screen.blit(t3,[100,100]) #在窗口显示
pygame.display.update() #更新屏幕
pygame.time.delay(10) #设置显示之间的延时
总结:
pygame是一个专门用来开发游戏的模块,可以包含图像、声音等。
pygame常用子模块
pygame.display访问显示设备
pygame.event 管理事件
pygame.font 使用字体
pygame.image 加栽和存储图片