一、pygame#

1. pygame简介#

Pygame是一套跨平台的Python模块,专为编写游戏而设计。

它包括计算机图形和声音库,旨在与Python编程语言一起使用。

pygame学习的内容:

1
2
3
4
5
展示游戏窗体
显示图片
事件捕获
显示文字
播放声音

安装pygame模块

1
pip install pygame

2. 展示窗口#

1
2
3
4
5
6
7
8
9
# 导入游戏引擎
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事件,实现退出

1
2
3
4
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
2
3
4
5
6
7
8
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中的渲染单元

1
2
window是Surface对象
window = pygame.display.set_mode(size=(800,800))
1
2
heroImg图片也是Surface对象
heroImg = pygame.image.load('img/hero2.png')
1
2
fontSurface文字也是Surface对象
fontSurface = font.render('游戏开始',True,(255,255,255))

Surface都具有的方法

1
2
3
4
5
fill()      # Surface填充颜色
blit()      # 将一个Surface添加到另外一个Surface上
get_width() # 获取控件的宽度
get_height()# 获取控件的高度
get_rect()  # 获取控件的矩形(左上角坐标和宽度和高度)