一、pygame
1. pygame简介
Pygame是一套跨平台的Python模块,专为编写游戏而设计。
它包括计算机图形和声音库,旨在与Python编程语言一起使用。
pygame学习的内容:
| 展示游戏窗体
显示图片
事件捕获
显示文字
播放声音
|
安装pygame模块
2. 展示窗口
| # 导入游戏引擎
import pygame
# 初始化pygame
pygame.init()
# 创建窗口
# size 窗口大小 宽度和高度
pygame.display.set_mode(size=(800,800))
|
窗口展示出来之后就一闪而过
原因是:程序执行结束,窗口就关闭
程序执行流程
可以使用死循环保证程序不停止,窗口就不会关闭了
1
2
3
4
5
6
7
8
9
10
11
12 | # 导入游戏引擎
import pygame
# 初始化pygame
pygame.init()
# 创建窗口
# size 窗口大小 宽度和高度
pygame.display.set_mode(size=(800,800))
# 避免程序结束
while True:
pass
|
3. 游戏停止
pygame可以监听各种事件,比如:键盘事件、鼠标事件、退出事件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 | # 导入游戏引擎
import pygame
from pygame.locals import *
import sys
# 初始化pygame
pygame.init()
# 创建窗口
# size 窗口大小 宽度和高度
window = pygame.display.set_mode(size=(800,800))
# 避免程序结束
while True:
# 处理事件
eventList = pygame.event.get()
for event in eventList:
# 退出事件类型
if event.type==QUIT:
# 退出界面
pygame.display.quit()
# sys退出
sys.exit()
|
监听如果点击了窗口的关闭按钮,就会执行QUIT事件,实现退出
| pygame.event.get()提供事件的清单
event.type指明了事件的类型
pygame.locals模块提供了常量
QUIT就是窗体关闭事件
|
4. 窗口标题和图标
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 | # 导入游戏引擎
import pygame
from pygame.locals import *
import sys
# 初始化pygame
pygame.init()
# 创建窗口
# size 窗口大小 宽度和高度
window = pygame.display.set_mode(size=(800,800))
# 设置窗口标题
pygame.display.set_caption('飞机大战')
# 加载图标
icon = pygame.image.load('img/app.ico')
# 设置图标
pygame.display.set_icon(icon)
# 避免程序结束
while True:
# 处理事件
eventList = pygame.event.get()
for event in eventList:
# 退出事件类型
if event.type==QUIT:
# 退出界面
pygame.display.quit()
# sys退出
sys.exit()
|
运行程序:
5. 展示图片
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38 | # 导入游戏引擎
import pygame
from pygame.locals import *
import sys
# 初始化pygame
pygame.init()
# 创建窗口
# size 窗口大小 宽度和高度
window = pygame.display.set_mode(size=(800,800))
# 设置窗口标题
pygame.display.set_caption('飞机大战')
# 加载图标
icon = pygame.image.load('img/app.ico')
# 设置图标
pygame.display.set_icon(icon)
# 加载飞机图片
heroImg = pygame.image.load('img/hero2.png')
# 避免程序结束
while True:
# 展示飞机图片
window.blit(heroImg,(40,40))
# 刷新
pygame.display.flip()
# 处理事件
eventList = pygame.event.get()
for event in eventList:
# 退出事件类型
if event.type==QUIT:
# 退出界面
pygame.display.quit()
# sys退出
sys.exit()
|
运行程序:
展示图片总结:
| 1.获取窗口
window = pygame.image.set_mode((400, 400))
2.加载图片
pygame.image.load(“xxx.png”)
3.将图片展示到窗口指定位置
window.blit(image, (0, 0))
4.刷新窗口
pygame.display.flip()
|
坐标系如下:
左上角为坐标原点
向右为x轴正方向
向下为y轴正方向
飞机以左上角确定坐标
6. 键盘事件处理
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36 | # 导入游戏引擎
import pygame
from pygame.locals import *
import sys
# 初始化pygame
pygame.init()
# 创建窗口
# size 窗口大小 宽度和高度
window = pygame.display.set_mode(size=(800,800))
# 避免程序结束
while True:
# 处理事件
eventList = pygame.event.get()
for event in eventList:
# 退出事件类型
if event.type==QUIT:# 退出事件类型
# 退出界面
pygame.display.quit()
# sys退出
sys.exit()
elif event.type==KEYDOWN:# 键盘按下的事件
# 判断按下的是哪个键
if event.key==K_a:
print('向左')
elif event.key==K_d:
print('向右')
elif event.key==K_w:
print('向前')
elif event.key==K_s:
print('向后')
elif event.key==K_RETURN:
print('点击了enter键')
|
KEYDOWN是键盘按下事件
可以根据type判断按下的是什么键
7. 展示文字
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 | # 导入游戏引擎
import pygame
from pygame.locals import *
import sys
# 初始化pygame
pygame.init()
# 创建窗口
# size 窗口大小 宽度和高度
window = pygame.display.set_mode(size=(800,800))
# 加载字体
font = pygame.font.Font('font/happy.ttf',50)
# 渲染字体
fontSurface = font.render('游戏开始',True,(255,255,255))
# 避免程序结束
while True:
# 显示字体控件
window.blit(fontSurface,(200,200))
# 刷新(只需要执行一次)
pygame.display.flip()
# 处理事件
eventList = pygame.event.get()
for event in eventList:
# 退出事件类型
if event.type==QUIT:
# 退出界面
pygame.display.quit()
# sys退出
sys.exit()
|
pygame.font.Font('font/happy.ttf',50) 字体和大小
展示文字和展示图片一样
1.加载文字 font.render(xxx,True,xxx)
2.展示到窗口指定位置 window.blit(xxx,xxx)
3.刷新 pygame.display.flip()
8. 背景音效
背景音效在游戏中只有一个
加载背景音效:pygame.mixer.music.load(“xx.wav”)
播放背景音效:pygame.mixer.music.play()
停止背景音效:pygame.mixer.music.stop()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 | # 导入游戏引擎
import pygame
from pygame.locals import *
import sys
# 初始化pygame
pygame.init()
# 创建窗口
# size 窗口大小 宽度和高度
window = pygame.display.set_mode(size=(800,800))
# 加载背景音效
pygame.mixer.music.load('snd/bomb.wav')
# 避免程序结束
while True:
# 处理事件
eventList = pygame.event.get()
for event in eventList:
# 退出事件类型
if event.type==QUIT:# 退出事件类型
# 退出界面
pygame.display.quit()
# sys退出
sys.exit()
elif event.type==KEYDOWN:# 键盘按下的事件
# 判断按下的是哪个键
if event.key==K_RETURN:
# 播放背景音效
pygame.mixer.music.play(loops=-1)
|
9. 播放音效
游戏中特定的场景可以播放不同的音效
加载音效:snd = pygame.mixer. Sound(“xx.wav”)
播放音效:snd.play()
停止音效:snd.stop()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 | # 导入游戏引擎
import pygame
from pygame.locals import *
import sys
# 初始化pygame
pygame.init()
# 创建窗口
# size 窗口大小 宽度和高度
window = pygame.display.set_mode(size=(800,800))
# 加载特殊音效
sn = pygame.mixer.Sound('snd/bomb.wav')
# 避免程序结束
while True:
# 处理事件
eventList = pygame.event.get()
for event in eventList:
# 退出事件类型
if event.type==QUIT:# 退出事件类型
# 退出界面
pygame.display.quit()
# sys退出
sys.exit()
elif event.type==KEYDOWN:# 键盘按下的事件
# 判断按下的是哪个键
if event.key==K_a:
sn.stop()
elif event.key==K_RETURN:
sn.play(loops=-1)
|
10. FPS
FPS:Frames Per Second 每秒钟渲染的帧数
其实就是每秒钟while循环执行的次数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71 | # 导入游戏引擎
import pygame
from pygame.locals import *
import sys
import time
# 初始化pygame
pygame.init()
# 创建窗口
# size 窗口大小 宽度和高度
window = pygame.display.set_mode(size=(800,800))
# 设置窗口标题
pygame.display.set_caption('飞机大战')
# 加载图标
icon = pygame.image.load('img/app.ico')
# 设置图标
pygame.display.set_icon(icon)
# 加载飞机图片
heroImg = pygame.image.load('img/hero2.png')
heroX = 200
heroY = 200
# 避免程序结束
while True:
# 开始时间
startTime = time.time()
# 清空窗口,通过背景颜色覆盖
# R G B
window.fill((0,0,0))
# 展示飞机图片
window.blit(heroImg,(heroX,heroY))
# 刷新
pygame.display.flip()
# 处理事件
eventList = pygame.event.get()
for event in eventList:
# 退出事件类型
if event.type==QUIT:
# 退出界面
pygame.display.quit()
# sys退出
sys.exit()
elif event.type==KEYDOWN:# 键盘按下的事件
# 判断按下的是哪个键
if event.key==K_a:
heroX-=10
elif event.key==K_d:
heroX+=10
elif event.key==K_w:
heroY-=10
elif event.key==K_s:
heroY+=10
# 降低fps
time.sleep(0.008)
# 结束时间
endTime = time.time()
# 这一次渲染时间
renderTime = endTime-startTime
try:
# 求FPS
fps = int(1/renderTime)
print(fps)
except:
pass
|
11. Surface
Surface是pygame中的渲染单元
| window是Surface对象
window = pygame.display.set_mode(size=(800,800))
|
| heroImg图片也是Surface对象
heroImg = pygame.image.load('img/hero2.png')
|
| fontSurface文字也是Surface对象
fontSurface = font.render('游戏开始',True,(255,255,255))
|
Surface都具有的方法
| fill() # Surface填充颜色
blit() # 将一个Surface添加到另外一个Surface上
get_width() # 获取控件的宽度
get_height()# 获取控件的高度
get_rect() # 获取控件的矩形(左上角坐标和宽度和高度)
|