PyGame游戏的基本结构
最简单的PyGame代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
# 倒入PyGame框架
import pygame
# 初始化PyGame
pygame.init()
# 显示指定大小的窗口,返回的是一个Surface对象,你可以在其上进行绘图操作
win = pygame.display.set_mode((400,400))
# 消息循环
running = True
while running:
for event in pygame.event.get(): # 查询事件队列
if event.type == pygame.QUIT: # 点击关闭按钮退出
running = False
pygame.display.flip() # pygame使用的是双缓冲区,这个函数交换缓冲区:更新窗口
print("End Game")
|
执行之后显示一个黑黑的窗口:
![Python pygame Python pygame](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzQ2LzMyZjVkNDc5ZTBjMjFhNDdlZDYwNGIzYTQ0NzYwN2ZlLnBuZw==)
画一个方块
pygame.draw.rect是绘制长方形函数。第一个参数指定要在哪个surface上画(win);第二个参数指定颜色,RGB格式;第三个参数指定绘制的位置,x,y代表左上角坐标,另外两个代表长方体长和宽。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
import
pygame
pygame.init()
win
=
pygame.display.set_mode((400,400))
pygame.draw.rect(win,
(255,10,10),
pygame.Rect(30,30,60,60))
running
=
True
while
running:
for
event
in
pygame.event.get():
if
event.type
==
pygame.QUIT:
running
=
False
pygame.display.flip()
print("End
Game")
|
![Python pygame Python pygame](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzk4Mi82OTg0YjBmMGU2MDhiNjBlNDM5ZjYzYzQ3ODdiOTBkZS5wbmc=)
按键交互
下面实现使用空格键改变方块的颜色。
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
|
import pygame
pygame.init()
win = pygame.display.set_mode((400,400))
running = True
change_color = True # 控制方块颜色
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
# 处理空格键按下事件
if event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE:
change_color = not change_color
color = None
if change_color:
color = (10, 10, 255)
else:
color = (255, 10, 10)
pygame.draw.rect(win, color, pygame.Rect(30,30,60,60))
pygame.display.flip()
print("End Game")
|
![Python pygame Python pygame](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzUwOC8xYTZjNjBmYWNlYzI5MDA5YjQzOGRmNDJhZDNmYjBiYy5wbmc=)
上面用到了pygame.KEYDOWN,和它对应的是KEYUP事件类型。pygame.K_****代表键盘上的按键,你可以用dir函数查看支持的按键:
|
>>>
import
pygame
>>>
filter(lambda
x:'K_'
in
x,
dir(pygame))
['K_0',
'K_1',
'K_2',
'K_3',
'K_4',
'K_5',
'K_6',
'K_7',
'K_8',
'K_9',
'K_AMPERSAND',
'K_ASTERISK',
'K_AT',
'K_BACKQUOTE',
'K_BACKSLASH',
'K_BACKSPACE',
'K_BREAK',
'K_CAPSLOCK',
'K_CARET',
'K_CLEAR',
'K_COLON',
'K_COMMA',
'K_DELETE',
。。。。。
|
用箭头键移动方块
还有一种处理键盘按键的方式:使用pygame.key.get_pressed()函数获得所有按键的状态,它返回一个0、1的大数组,分别代表每一个按键的状态,1代表该按键按下,0代表该按键没有按下。
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
|
import pygame
pygame.init()
win = pygame.display.set_mode((400,400))
running = True
change_color = True
x = 30
y = 30
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
if event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE:
change_color = not change_color
color = None
if change_color:
color = (10, 10, 255)
else:
color = (255, 10, 10)
pressed = pygame.key.get_pressed() # 获取所有按键状态
if pressed[pygame.K_UP]: # 箭头键上是否被按下
y -= 1
if pressed[pygame.K_DOWN]:
y += 1
if pressed[pygame.K_LEFT]:
x -= 1
if pressed[pygame.K_RIGHT]:
x += 1
pygame.draw.rect(win, color, pygame.Rect(x,y,60,60))
pygame.display.flip()
print("End Game")
|
![Python pygame Python pygame](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzM2NC9iNmZlNmMxZjdkYTA2NTMxZTlhZmVkZjY1YTcyYTBmNC5wbmc=)
上面有两个问题需要解决:
- 每次画新方块,前一个方块并不会消失,它还留在屏幕上。
- 它移动的太快,因为死循环里没有任何延时。
对于第一问题,你可以在绘制方块之前重新设置屏幕(黑色),Surface里有一个方法fill:
对于第二个问题,是因为屏幕刷新太快,一般游戏的刷新(fps)为每秒钟60次。你可以自己手动写延迟代码,也可以用PyGame里的Clock类:
|
clock = pygame.time.Clock()
while running:
.....some code
clock.tick(60) # 和前一次调用这个函数的时间间隔为1/60秒
|
完整代码:
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
|
import
pygame
pygame.init()
win
=
pygame.display.set_mode((400,400))
running
=
True
change_color
=
True
x
=
30
y
=
30
clock
=
pygame.time.Clock()
while
running:
for
event
in
pygame.event.get():
if
event.type
==
pygame.QUIT:
running
=
False
if
event.type
==
pygame.KEYDOWN
and
event.key
==
pygame.K_SPACE:
change_color
=
not
change_color
color
=
None
if
change_color:
color
=
(10,
10,
255)
else:
color
=
(255,
10,
10)
pressed
=
pygame.key.get_pressed()
if
pressed[pygame.K_UP]:
y
-=
1
if
pressed[pygame.K_DOWN]:
y
+=
1
if
pressed[pygame.K_LEFT]:
x
-=
1
if
pressed[pygame.K_RIGHT]:
x
+=
1
win.fill((0,
0,
0))
pygame.draw.rect(win,
color,
pygame.Rect(x,y,60,60))
pygame.display.flip()
clock.tick(60)
print("End
Game")
|
![Python pygame Python pygame](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzk4NC8xM2IzYzc1NjJjZWQxMDBjNTUwNGMxNDQ4NzBlNzY3OC5wbmc=)