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函数查看支持的按键:
1
2
3
4
|
>>>
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:
1
|
win
.
fill
(
0
,
0
,
0
)
|
对于第二个问题,是因为屏幕刷新太快,一般游戏的刷新(fps)为每秒钟60次。你可以自己手动写延迟代码,也可以用PyGame里的Clock类:
1
2
3
4
5
6
7
8
|
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"
)
|