pygame初步探索
2020-07-02 本文已影响0人
指向远方的灯塔
https://www.bilibili.com/video/BV1XW411E7vb?p=1
一、python的IDE(集成开发环境)工具
![](https://img.haomeiwen.com/i14594540/8c8bfe239c60bf6c.png)
二、pygame 模块的安装(以pycharm为例)以及简单介绍
如果你的电脑使用pycharm编辑器,可以通过以下方式安装:
pip install pygame
pip是python的包管理工具,就是第三方库安装、下载的管家。
Pygame是Python最经典的2D游戏开发第三方库,也支持3D游戏开发。
pygame适用于游戏逻辑验证、游戏入门及系统演示验证;pygame是一种游戏开发引擎,基本逻辑具有参考价值。
三、小试牛刀
1.pygame模块中自带演示小游戏
python -m pygame.examples.aliens
2.pygame最小开发框架
![](https://img.haomeiwen.com/i14594540/f46a6c7746d67cc9.png)
sys是Python的标准库
sys提供Python运行时环境变量的操控,sys.exit()用于退出结束游戏并退出
#导入pygame和sys库
import pygame
import sys
#初始化init()及设置
pygame.init()
screen = pygame.display.set_mode((600,400))
pygame.display.set_caption("Pygame游戏之旅")
#获取事件并逐类响应>>>重复执行
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
pygame.display.update()
3.壁球小游戏(展示型)与图像的基本使用
![](https://img.haomeiwen.com/i14594540/2a95869628ed7fff.png)
小球的链接
https://python123.io/PY15/PYG02-ball.gif
笛卡尔坐标系
![](https://img.haomeiwen.com/i14594540/d27443872d75e5b9.png)
![](https://img.haomeiwen.com/i14594540/ab9ab853a7e28a06.png)
![](https://img.haomeiwen.com/i14594540/766f3cdebe9e3e91.png)
![](https://img.haomeiwen.com/i14594540/fa413e26b3a7f371.png)
![](https://img.haomeiwen.com/i14594540/7cd2ee2a17ff5c03.png)
![](https://img.haomeiwen.com/i14594540/1cd445fab9ff57a4.png)
![](https://img.haomeiwen.com/i14594540/5bb61f27993dcebb.png)
![](https://img.haomeiwen.com/i14594540/e190097687e6f8d1.png)
#导入pygame和sys
import pygame,sys
#初始化设置
pygame.init()
#定义窗口宽度和高度
size = width,height =600,400
#速度列表
speed = [1,1]
#配置背景颜色
BLACK = 0,0,0
#设置窗口的宽度和高度
screen = pygame.display.set_mode(size)
#设置游戏的名称
pygame.display.set_caption("Python壁球")
#导入图片
ball = pygame.image.load("ball.png")
#获得矩形图形
ballrect = ball.get_rect()
#获取事件并逐类响应
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
#设置角色的偏移量,即在横轴方向移动x像素,纵轴方向移动y像素,xy为整数
ballrect = ballrect.move(speed[0],speed[1])
#壁球的反弹运动
if ballrect.left < 0 or ballrect.right > width:
speed[0] = -speed[0]
if ballrect.top<0 or ballrect.bottom > height:
speed[1] = -speed[1]
#显示窗口背景填充为color颜色,采用RGB色彩体系
screen.fill(BLACK)
#通过Rect对象引导对壁球的绘制
screen.blit(ball, ballrect)
#刷新屏幕
pygame.display.update()
4.壁球小游戏(节奏型)与屏幕的帧率设置
![](https://img.haomeiwen.com/i14594540/2fae1874d539187f.png)
![](https://img.haomeiwen.com/i14594540/7546089adb5a50d5.png)
![](https://img.haomeiwen.com/i14594540/fed3fefbcc20c8d5.png)
#导入pygame和sys
import pygame,sys
#初始化设置
pygame.init()
#定义窗口宽度和高度
size = width,height =600,400
#速度列表
speed = [1,1]
#配置背景颜色
BLACK = 0,0,0
#设置窗口的宽度和高度
screen = pygame.display.set_mode(size)
#设置游戏的名称
pygame.display.set_caption("Python壁球")
#导入图片
ball = pygame.image.load("ball.png")
#获得矩形图形
ballrect = ball.get_rect()
fps = 300#每秒帧数参数
#创建一个Clock对象,用于操作时间
fclock = pygame.time.Clock()
#获取事件并逐类响应
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
#设置角色的偏移量,即在横轴方向移动x像素,纵轴方向移动y像素,xy为整数
ballrect = ballrect.move(speed[0],speed[1])
#壁球的反弹运动
if ballrect.left < 0 or ballrect.right > width:
speed[0] = -speed[0]
if ballrect.top<0 or ballrect.bottom > height:
speed[1] = -speed[1]
#显示窗口背景填充为color颜色,采用RGB色彩体系
screen.fill(BLACK)
#通过Rect对象引导对壁球的绘制
screen.blit(ball, ballrect)
#刷新屏幕
pygame.display.update()
fclock.tick(fps)
5.壁球小游戏(操控型)与键盘的基本使用
![](https://img.haomeiwen.com/i14594540/b99012d0352bf5aa.png)
![](https://img.haomeiwen.com/i14594540/ef3c2765d86195f3.png)
![](https://img.haomeiwen.com/i14594540/ea7d469b35099527.png)
#导入pygame和sys
import pygame,sys
#初始化设置
pygame.init()
#定义窗口宽度和高度
size = width,height =600,400
#速度列表
speed = [1,1]
#配置背景颜色
BLACK = 0,0,0
#设置窗口的宽度和高度
screen = pygame.display.set_mode(size)
#设置游戏的名称
pygame.display.set_caption("Python壁球")
#导入图片
ball = pygame.image.load("ball.png")
#获得矩形图形
ballrect = ball.get_rect()
fps = 300#每秒帧数参数
#创建一个Clock对象,用于操作时间
fclock = pygame.time.Clock()
#获取事件并逐类响应
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
speed[0] = speed[0] if speed[0] == 0 else(abs(speed[0]-1)*int(speed[0]/abs(speed[0])))
elif event.key == pygame.K_RIGHT:
speed[0] = speed[0] + 1 if speed[0]>0 else speed[0] - 1
elif event.key == pygame.K_UP:
speed[1] = speed[1] +1 if speed[1] > 0 else speed - 1
elif event.key == pygame.K_DOWN:
speed[1] = speed[1] if speed[1] == 0 else (abs(speed[1])-1)*int(speed[1]/abs(speed[1]))
#设置角色的偏移量,即在横轴方向移动x像素,纵轴方向移动y像素,xy为整数
ballrect = ballrect.move(speed[0],speed[1])
#壁球的反弹运动
if ballrect.left < 0 or ballrect.right > width:
speed[0] = -speed[0]
if ballrect.top<0 or ballrect.bottom > height:
speed[1] = -speed[1]
#显示窗口背景填充为color颜色,采用RGB色彩体系
screen.fill(BLACK)
#通过Rect对象引导对壁球的绘制
screen.blit(ball, ballrect)
#刷新屏幕
pygame.display.update()
fclock.tick(fps)
四、pygame屏幕绘制机制
pygame使用pygame.display来控制pygame的游戏屏幕,在pygame中只有一个游戏屏幕,如果我们想要切换到多个屏幕,我们只能在此屏幕消失后,生成新的屏幕。
使用笛卡尔坐标系,左上方是坐标原点,横方向是x轴,纵方向是y轴。屏幕的尺寸以像素为单位。
![](https://img.haomeiwen.com/i14594540/db3a2f7563caa609.png)
pygame.display.set_mode()可以设置游戏屏幕的尺寸,以及相关的模式。
![](https://img.haomeiwen.com/i14594540/6addb988e4efb083.png)
注意:每种显示方式要配合相应的处理机制
![](https://img.haomeiwen.com/i14594540/8b3f742e63e7cb08.png)
![](https://img.haomeiwen.com/i14594540/ab07fa604e0a7c34.png)
![](https://img.haomeiwen.com/i14594540/f98f90796bd53c96.png)
![](https://img.haomeiwen.com/i14594540/a885a34c705c9c9d.png)
Pygame窗口标题和图标设置
![](https://img.haomeiwen.com/i14594540/577c2f39acd481bf.png)
![](https://img.haomeiwen.com/i14594540/7990660e86f298f8.png)
![](https://img.haomeiwen.com/i14594540/90bba788e7ec1e72.png)
pygame中surface对象是唯一的与图像对应的对象
![](https://img.haomeiwen.com/i14594540/bcd57f854cacbe76.png)
![](https://img.haomeiwen.com/i14594540/e91221a8a0237e4c.png)
pygame窗口感知和刷新设置
![](https://img.haomeiwen.com/i14594540/7ca614b2a6438967.png)
![](https://img.haomeiwen.com/i14594540/a2a8932b7be6a76c.png)
flip()函数会重新绘制窗口,update()函数仅仅会绘制变化的地方。
五、pygame的事件处理机制
![](https://img.haomeiwen.com/i14594540/39c86c83947f209b.png)
![](https://img.haomeiwen.com/i14594540/de2974981f8c7d61.png)
![](https://img.haomeiwen.com/i14594540/5d4e3373060d52fb.png)
![](https://img.haomeiwen.com/i14594540/bfd6d3a06d67e854.png)
![](https://img.haomeiwen.com/i14594540/b4a0cc28dd016378.png)
![](https://img.haomeiwen.com/i14594540/8f84def4f6a82cfa.png)
![](https://img.haomeiwen.com/i14594540/79eb367d52f6b609.png)
注意:unicode码与平台有关,不推荐使用
![](https://img.haomeiwen.com/i14594540/de43110e0dbd9ec0.png)
![](https://img.haomeiwen.com/i14594540/0e9c104c38e6cac8.png)
![](https://img.haomeiwen.com/i14594540/109f9ba8cd53fa16.png)
鼠标事件及类型的使用
![](https://img.haomeiwen.com/i14594540/5f639d4966c5a738.png)
![](https://img.haomeiwen.com/i14594540/f120cdc96befec7a.png)
![](https://img.haomeiwen.com/i14594540/1f04b71dcbf4bd7c.png)
![](https://img.haomeiwen.com/i14594540/45e66a490f318694.png)
![](https://img.haomeiwen.com/i14594540/6e6cf33520f73b06.png)
move()函数的参数xy是相对位置
![](https://img.haomeiwen.com/i14594540/cf88a98b8425f3bb.png)
![](https://img.haomeiwen.com/i14594540/9b268700f8122a32.png)
![](https://img.haomeiwen.com/i14594540/a639dc08b262ab6a.png)
在pygame的设计中,事件队列只能存储108个事件,会将所有新到的事件丢弃掉。
![](https://img.haomeiwen.com/i14594540/bc201842dad46493.png)
![](https://img.haomeiwen.com/i14594540/707e937ba42d7fe4.png)
#每帧刷新一次,并产生一次事件
#导入pygame和sys库
import pygame
import sys
#初始化init()及设置
pygame.init()
screen = pygame.display.set_mode((600,400))
pygame.display.set_caption("Pygame事件处理")
fps = 1
fclock = pygame.time.Clock()
num = 1
#获取事件并逐类响应>>>重复执行
while True:
uevent = pygame.event.Event(pygame.KEYDOWN,{"unicode":123,"key":pygame.K_SPACE,"mod":pygame.KMOD_ALT})
pygame.event.post(uevent)
num = num+1
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
elif event.type == pygame.KEYDOWN:
if event.unicode =="":
print("[KEYDOWN{}]".format(num),"#",event.key,event.mod)
else:
print("[KEYDOWN{}]".format(num),event.unicode,event.key,event.mod)
pygame.display.update()
fclock.tick(fps)
六.pygame的色彩与图形绘制机制
![](https://img.haomeiwen.com/i14594540/ae9177c161de59cc.png)
![](https://img.haomeiwen.com/i14594540/2932167bcee9ed6c.png)
![](https://img.haomeiwen.com/i14594540/aaddc0c59f1706fc.png)
![](https://img.haomeiwen.com/i14594540/2e66f53c8f95bab7.png)
![](https://img.haomeiwen.com/i14594540/fea1766128444007.png)
#导入pygame和sys
import pygame,sys
#初始化设置
pygame.init()
#图标导入并设置图标
icon=pygame.image.load("flower.png")#load()函数生成的是surflower图形对象,保存到变量里
pygame.display.set_icon(icon)
#定义窗口宽度和高度
size = width,height =600,400
#速度列表
speed = [1,1]
#配置背景颜色
BLACK = 0,0,0
#设置窗口的宽度和高度
screen = pygame.display.set_mode(size)
#设置游戏的名称
pygame.display.set_caption("Python壁球")
#导入图片
ball = pygame.image.load("ball.png")
#获得矩形图形
ballrect = ball.get_rect()
fps = 300#每秒帧数参数
#创建一个Clock对象,用于操作时间
fclock = pygame.time.Clock()
still = False
bgcolor = pygame.Color("black")
#定义通道函数
def RGBChannel(a):
return 0 if a<0 else (255 if a>255 else int(a))
#获取事件并逐类响应
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
speed[0] = speed[0] if speed[0] == 0 else(abs(speed[0]-1)*int(speed[0]/abs(speed[0])))
elif event.key == pygame.K_RIGHT:
speed[0] = speed[0] + 1 if speed[0]>0 else speed[0] - 1
elif event.key == pygame.K_UP:
speed[1] = speed[1] +1 if speed[1] > 0 else speed[1] - 1
elif event.key == pygame.K_DOWN:
speed[1] = speed[1] if speed[1] == 0 else (abs(speed[1])-1)*int(speed[1]/abs(speed[1]))
elif event.type == pygame.VIDEORESIZE:
size = width,height=event.size[0],event.size[1]
screen = pygame.display.set_mode(size,pygame.RESIZABLE)
elif event.type == pygame.MOUSEBUTTONDOWN:
if event.button == 1:
still = True
elif event.type == pygame.MOUSEBUTTONUP:
still = False
if event.button == 1:
ballrect = ballrect.move(event.pos[0]-ballrect.left,event.pos[1]-ballrect.top)
elif event.type == pygame.MOUSEMOTION:
if event.buttons[0] == 1:
ballrect = ballrect.move(event.pos[0]-ballrect.left,event.pos[1]-ballrect.top)
#将屏幕控制函数
if pygame.display.get_active() and not still:
#设置角色的偏移量,即在横轴方向移动x像素,纵轴方向移动y像素,xy为整数
ballrect = ballrect.move(speed[0],speed[1])#move()函数处理的是相对位置
#壁球的反弹运动
if ballrect.left < 0 or ballrect.right > width:
speed[0] = -speed[0]
if ballrect.right>width and ballrect.right + speed[0]>ballrect.right:
speed[0] = -speed[0]
if ballrect.top<0 or ballrect.bottom > height:
speed[1] = -speed[1]
if ballrect.bottom>height and ballrect.bottom + speed[1] > ballrect.bottom:
speed[1] = -speed[1]
#建立颜色通道
bgcolor.r = RGBChannel(ballrect.left*255/width)
bgcolor.g = RGBChannel(ballrect.top*255/height)
bgcolor.b = RGBChannel(min(speed[0],speed[1])*255/max(speed[0],speed[1]))
#显示窗口背景填充为color颜色,采用RGB色彩体系
# screen.fill(BLACK)
screen.fill(bgcolor)
#通过Rect对象引导对壁球的绘制
screen.blit(ball, ballrect)
#刷新屏幕
pygame.display.update()
fclock.tick(fps)
![](https://img.haomeiwen.com/i14594540/707fd7a2ff54a85a.png)
![](https://img.haomeiwen.com/i14594540/93565aca8ea12a74.png)
![](https://img.haomeiwen.com/i14594540/8becb839815c10ea.png)
![](https://img.haomeiwen.com/i14594540/bbe7e5d10f4f718f.png)
![](https://img.haomeiwen.com/i14594540/ee4fc5c9ec24e638.png)
![](https://img.haomeiwen.com/i14594540/8fcb5f150fe3c791.png)
![](https://img.haomeiwen.com/i14594540/3d2b59343d83a549.png)
![](https://img.haomeiwen.com/i14594540/51a868ad926befb0.png)
![](https://img.haomeiwen.com/i14594540/4d03254e13c93d1c.png)
![](https://img.haomeiwen.com/i14594540/cf462d617b70dcf3.png)
![](https://img.haomeiwen.com/i14594540/07b9f90d5aca9009.png)
![](https://img.haomeiwen.com/i14594540/a00c3ff167bdd28c.png)
![](https://img.haomeiwen.com/i14594540/ac537b8bd80d8fe6.png)
![](https://img.haomeiwen.com/i14594540/e9d7fbe62d265a11.png)
pygame的文字绘制机制
![](https://img.haomeiwen.com/i14594540/959727582ec7ebd8.png)
![](https://img.haomeiwen.com/i14594540/7d48a08379a5ba89.png)
freetype()是绘制文字的增强方法,我们必须使用import将它引用
![](https://img.haomeiwen.com/i14594540/19b53a4265a453a5.png)
![](https://img.haomeiwen.com/i14594540/a96c805e9857f344.png)
![](https://img.haomeiwen.com/i14594540/6824f1f923d4b67d.png)
![](https://img.haomeiwen.com/i14594540/0b8e0af3eac690ac.png)
![](https://img.haomeiwen.com/i14594540/e412844ac5459182.png)
![](https://img.haomeiwen.com/i14594540/7608c834aee683b6.png)
七、pygame绘制机制原理精髓
![](https://img.haomeiwen.com/i14594540/7981989d189cef6d.png)
![](https://img.haomeiwen.com/i14594540/1d630d4c9d6f4134.png)
![](https://img.haomeiwen.com/i14594540/a897cb4346b4f0d2.png)
![](https://img.haomeiwen.com/i14594540/1273bc0fc4491996.png)
![](https://img.haomeiwen.com/i14594540/20d0fa9ae4f377c0.png)