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") |
执行之后显示一个黑黑的窗口:

画一个方块
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")
|

按键交互
下面实现使用空格键改变方块的颜色。
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") |

上面用到了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") |

上面有两个问题需要解决:
- 每次画新方块,前一个方块并不会消失,它还留在屏幕上。
- 它移动的太快,因为死循环里没有任何延时。
对于第一问题,你可以在绘制方块之前重新设置屏幕(黑色),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")
|
