想写小游戏的心早就有了,但是一直觉得额外学习一门语言的GUI编程好像不是很划算,今年趁着看了点 python 的内容,所以想试试用python来写,在过程中了解到python有一个专门的库——pygame ,所以就看了点教程,以下权当做个笔记

初识 pygame

pygame最小开发框架主要包含两个方面 —— 引入库和初始化,主循环和刷新

  • 引入主要是引入自己要用到的库
  • 初始化主要是初始化窗体,主要包括窗体的大小,窗体的名称,图标等等
  • 主循环主要是接收操作,逻辑判断,事件处理和刷新游戏等

根据教程的壁球小游戏,我直接贴上老师的代码:

初始化部分

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, sys
from pygame.locals import *


# 初始化 pygame
pygame.init()
# 获取系统屏幕尺寸大小
sysSize = pygame.display.Info()
size = width, height = 400, 600
speed = [1, 1]
BLACK = 255, 255, 255

# 创建屏幕对象并设定尺寸
screen = pygame.display.set_mode(size)
# 屏幕大小可调节
# screen = pygame.display.set_mode(size, pygame.RESIZABLE)
# 屏幕无边框
# screen = pygame.display.set_mode(size, pygame.NOFRAME)
# 全屏模式
# screen = pygame.display.set_mode(sysSize, pygame.FULLSCREEN)

# 设置窗体显示 一般为游戏名称
pygame.display.set_caption("壁球")
icon = pygame.image.load("F:\\PYG02-ball.gif")
# 设置窗体图标
pygame.display.set_icon(icon)
  • 首先,pygame.init()代表初始化pygame,也就是所有用pygame写的第一句代码
  • 之后可以看到初始化部分主要依托于pygame.XXX()的属性设置来完成,具体属性见代码注释
    • 比如:pygame.display.set_mode() 来设置窗体大小
    • pygame.display.set_caption() 来设置窗体名称
    • pygame.display.set_icon(icon) 设置窗体图标 等等......
    • pygame.display.Info() 来获取系统,也就是自己电脑的屏幕尺寸大小

主循环和刷新

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
# 载入球图片 保存为一个 Surface 对象
ball = pygame.image.load("F:\\PYG02-ball.gif")
# 调用 get_rect() 方法 返回覆盖图像的矩形 Rect 对象
# Rect 对象具有 上下左右宽高 等属性
ballRect = ball.get_rect()
fps = 500
fClock = pygame.time.Clock()


# while True 为游戏主体循环
running = True
while running:
# 从队列中取出事件
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
# 按键操控
elif event.type == KEYDOWN:
if event.key == K_ESCAPE:
running = False
elif event.key == K_LEFT:
speed[0] = speed[0] if speed[0] == 0 else (abs(speed[0]) - 1) * int(speed[0]/abs(speed[0]))
elif event.key == K_RIGHT:
speed[0] = speed[0] + 1 if speed[0] > 0 else speed[0] - 1
elif event.key == K_DOWN:
speed[1] = speed[1] if speed[1] == 0 else (abs(speed[1]) - 1) * int(speed[1]/abs(speed[1]))
elif event.key == K_UP:
speed[1] = speed[1] + 1 if speed[1] > 0 else speed[1] - 1
# 如果改变了窗体大小
elif event.type == pygame.VIDEORESIZE:
size = width, height = event.size[0], event.size[1]
screen = pygame.display.set_mode(size, pygame.RESIZABLE)

# 判断窗体是否被最小化
if pygame.display.get_active():
# 调用move方法移动矩形
ballRect = ballRect.move(speed[0], speed[1])
# 判断 反弹
if ballRect.left < 0 or ballRect.right > width:
speed[0] = -speed[0]
if ballRect.top < 0 or ballRect.bottom > height:
speed[1] = -speed[1]

# 填充窗口背景
screen.fill(BLACK)
# 使小球绘制在矩形框内
screen.blit(ball, ballRect)
pygame.display.update()
# 控制帧速度
fClock.tick(fps)
  • 载入图片,之后会保存为surface 对象,因此载入的图片可以运用其方法和属性
  • for event in pygame.event.get(): pygame 中的事件都储存在队列中,需要逐次取出
    • event.type == KEYDOWN 表示按下某个键,在此判断内,可以进而匹配是按下了什么键
  • screen.fill(BLACK) 窗口的背景色,直接可以传RGB值
  • pygame.display.update() 刷新画面,适用于变换场景简单的画面
  • fClock.tick(fps) 控制帧率