本节课程主要讲解乐Pygame的一些常用对象及操作,如果要深入了解,可以参考[Pygame官方文档](http://www.pygame.org/docs/)。
## pygame简介
Pygame提供使用图形用户界面或GUI创建程序的功能。使用基于图形的GUI的程序可以代替基于文本的CLI显示带有图像和颜色的窗口。
## 安装pygame库
在终端输入命令,安装Pygame库:
```
sudo apt-get install python-pygame
```
## Hello world
```python
# helloworld.py
import pygame, sys # 导入所需的模块
from pygame.locals import * # 导入所有pygame.locals里的变量
pygame.init() # 初始化pygame
screen = pygame.display.set_mode((500, 400)) # 设置窗口的大小,单位为像素
pygame.display.set_caption('Hellow World') # 设置窗口标题
while True: # 程序主循环
for event in pygame.event.get(): # 获取事件
if event.type == QUIT: # 判断事件是否为退出事件
pygame.quit() # 退出pygame
sys.exit() # 退出系统
pygame.display.update() # 绘制屏幕内容
```
运行效果
<div align="center"><img src="4.png"/><p id="color" style="color:red">4.png</p></div>
这里解释上面程序的运行方式一个循环(主循环),做下面这三件事:
处理时间
更新游戏状态
绘制游戏状态到屏幕上
## 绘制图形
Pygame的坐标原点(0, 0)点位于左上角,X轴自左向右,Y轴自上向下,单位位像素。这里介绍一下常用的方法:
|方法|方法描述|
|---|---|
pygame.draw.line(Surface, color, start_pos, end_pos, width) |此方法用于绘制一条线段
pygame.draw.aaline(Surface, color, start_pos, end_pos, blend) |此方法用于绘制一条抗锯齿的线
pygame.draw.lines(Surface, color, closed, pointlist, width) |此方法用于绘制一条折线
pygame.draw.rect(Surface, color, Rect) |此方法用于绘制一个矩形
pygame.draw.rect(Surface, color, Rect, width) |此方法用于绘制一个矩形框
pygame.draw.ellipse(Surface, color, Rect, width) |此方法用于绘制一个椭圆框
pygame.draw.ellipse(Surface, color, Rect) |此方法用于绘制一个椭圆
pygame.draw.polygon(Surface, color, pointlist, width) |此方法用于绘制一个多边形
pygame.draw.arc(Surface, color, Rect, start_angle, stop_angle, width) |此方法用于绘制一条弧线
pygame.draw.circle(Surface, color, Rect, radius) |此方法用于绘制一个圆
以下为示例代码:
```python
# drawing.py
# 导入需要的模块
import pygame, sys
from pygame.locals import *
from math import pi
pygame.init() # 初始化pygame
screen = pygame.display.set_mode((400, 300)) # 设置窗口的大小,单位为像素
pygame.display.set_caption('Drawing') # 设置窗口标题
# 定义颜色
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)
screen.fill(WHITE) # 设置背景颜色
pygame.draw.line(screen, GREEN, [0, 0], [50, 30], 5) # 绘制一条线
pygame.draw.aaline(screen, GREEN, [0, 50], [50, 80], True) # 绘制一条抗锯齿的线
pygame.draw.lines(screen, BLACK, False, [[0, 80], [50, 90], [200, 80], [220, 30]], 5) #绘制一条直线
pygame.draw.rect(screen, BLACK, [75, 10, 50, 20], 2) #绘制一个空心矩形
pygame.draw.rect(screen, BLACK, [150, 10, 50, 20]) # 绘制一个矩形
# 绘制多条弧线
pygame.draw.arc(screen, BLACK, [210, 75, 150, 125], 0, pi/2, 2)
pygame.draw.arc(screen, GREEN, [210, 75, 150, 125], pi/2, pi, 2)
pygame.draw.arc(screen, BLUE, [210,75, 150, 125], pi, 3*pi/2, 2)
pygame.draw.arc(screen, RED, [210, 75, 150, 125], 3*pi/2, 2*pi, 2)
pygame.draw.circle(screen, BLUE, [60, 250], 40) # 绘制一个圆
while True: # 程序主循环:
for event in pygame.event.get(): # 获取事件
if event.type == QUIT: # 判断事件是否为退出事件
pygame.quit() # 退出pygame
sys.exit() # 退出系统
pygame.display.update() # 绘制屏幕内容
```
运行效果如下:
<div align="center"><img src="5.png"/><p id="color" style="color:red">5.png</p></div>
## 实现动画
pygame实现动画主要用到的方法:
|方法|方法描述|
|---|---|
pygame.image.load(filename)|加载一张图片
pygame.Surface.blit(Source, dest, area= None, special_flags = 0)|将图片绘制到屏幕相应坐标上(后面两个参数默认,可以不传)
pygame.time.Clock() |获得pygame的时钟
pygame.time.Clock.tick(FPS) |设置pygame时钟的间隔时间
以下为示例代码
```python
# animoation.py
# 导入需要的模块
import pygame, sys
from pygame.locals import *
pygame.init() # 初始化pygame
FPS = 30 # 设置帧率(屏幕每秒刷新的次数)
fpsClock = pygame.time.Clock() # 获得pygame的时钟
pygame.display.set_mode((500, 400), 0, 32) # 设置窗口大小
pygame.display.set_caption('Animation') # 设置标题
WHITE = (255, 255, 255) # 定义颜色
img = pygame.image.load('resources/test.png') # 加载一张图片(所用到的图片参考1.5代码获取)
# 初始化图片的位置
imgx = 10
imgy = 10
direction = 'right' # 初始化图片的移动方向
while True: # 程序主循环
screen.fill(WHITE) # 每次都要重新绘制背景白色
# 判断移动的方向,并对相应的坐标做加减
if direction == 'right':
imgx += 5
if imgx == 380:
direction = 'down'
elif direction == 'down':
imgy += 5
if imgy == 300:
direction = 'left'
elif direction == 'left':
imgx -= 5
if imgx == 10:
direction = 'up'
elif direction == 'up':
imgy -= 5
if imgy == 10:
direction = 'right'
screen.blit(img, (imgx, imgy)) # 该方法将用于图片绘制到相应的坐标中
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
pygame.display.update() # 刷新屏幕
fpsClock.tick(FPS) # 设置pygame时钟的间隔时间
```
## 绘制文字
Pygame提供了很方便的方法使用.ttf字体文件,这样我们就能很轻易的将文字绘制在屏幕上了。 主要用到的方法(以ARBERKLEY.ttf字体为例):
|方法|方法描述|
|---|---|
pygame.font.Font(filename, size) |创建字体对象
pygame.font.Font.render(text, antialias, color, background=None) |
.get_rect() |获得一个对象的rect,以便于设置其坐标位置
以下为示例代码:
```python
# font.py
# 导入需要的模块
import pygame, sys
from pygame.locals import *
pygame.init() # 初始化pygame
screen = pygame.display.set_mode((500,400)) # 设置窗口的大小,单位为像素
pygame.display.set_caption('Font') # 设置窗口的标题
# 定义颜色
WHITE = (255, 255, 255)
GREEN = ( 0, 255, 0)
BLUE = ( 0, 0, 128)
fontObj = pygame.font.Font('resources/ARBERKLEY.ttf', 50) # 通过字体文件获得字体对象
textSurfaceObj = fontObj.render('Pygame', True, BLUE, GREEN) # 配置要显示的文字
textRectObj = textSurfaceObj.get_rect() # 获得要显示的对象的rect
textRectObj.center = (250, 200) # 设置显示对象的坐标
screen.fill(WHITE) # 设置背景
screen.blit(textSurfaceObj, textRectObj) # 绘制字体
while True: # 程序主循环
for event in pygame.event.get(): # 获取事件
if event.type == QUIT: # 判断事件是否为退出事件
pygame.quit() # 退出pygame
sys.exit() # 退出系统
pygame.display.update() # 绘制屏幕内容
```
## 播放音频
在Pygame里播放音频有两个方法,一个用来播放特效声音,一个用来播放背景音乐:
|方法|方法描述
|---|---|
pygame.mixer.Sound(filename) |该方法返回一个Sound对象,调用它的.play( )方法,即可播放较短的音频文件(比如玩家受到伤害、收集到金币等)
pygame.mixer.music.load(filename) |该方法用来加载背景音乐pygame.mixer.music.play( )|调用方法就可以播放背景音乐(在同一个时刻只允许加载一个背景音乐)
以下为示例代码:
```python
# audio.py
# 导入需要的模块
import pygame, sys
from pygame.locals import *
pygame.init() # 初始化pygame
screen = pygame.display.set_mode((500,400)) # 设置窗口的大小,单位为像素
pygame.display.set_caption('Audio') # 设置窗口的标题
WHITE = (255, 255, 255) # 定义颜色
screen.fill(WHITE) # 设置背景
sound = pygame.mixer.Sound('resources/bounce.ogg') # 加载并播放一个特效音频文件(所用到的音频文件请参考1.5代码获取)
sound.play()
pygame.mixer.music.load('resources/bgmusic.mp3') # 加载背景音乐文件
# 播放背景音乐,第一个参数为播放的次数(-1表示无限循环),第二个参数是设置播放的起点(单位为秒)
pygame.mixer.music.play(-1, 0.0)
while True: # 程序主循环
for event in pygame.event.get(): # 获取事件
if event.type == QUIT: # 判断事件是否为退出事件
pygame.mixer.music.stop() # 停止播放背景音乐
pygame.quit() # 退出pygame
sys.exit() # 退出系统
pygame.display.update() # 绘制屏幕内容
```
## 事件
Pygame里常用的事件如下表:
|事件|产生途径|参数
|---|---|---|
|QUIT| 用户按下关闭按钮 |none
ACTIVEEVENT| Pygame被激活或者隐藏| gain, state
|KEYDOWN |键盘被按下 |unicode, key, mod
KEYUP| 键盘被放开| key, mod
MOUSEMOTION| 鼠标移动| pos, rel, buttons
MOUSEBUTTONDOWN| 鼠标按下| pos, button
MOUSEBUTTONUP| 鼠标放开| pos, button
VIDEORESIZE| Pygame窗口缩放| size, w, h
以下为示例代码:
```python
# event.py
# 导入需要的模块
import pygame, sys
from pygame.locals import *
WHITE = (255, 255, 255) # 定义颜色
pygame.init() # 初始化pygame
screen = pygame.display.set_mode((500, 400), 0, 32) # 设置窗口的大小,单位为像素
pygame.display.set_caption('Event') # 设置窗口的标题
screen.fill(WHITE) # 设置背景
while True: # 程序主循环
for event in pygame.event.get(): # 获取事件
if event.type == QUIT: # 判断事件是否为退出事件
pygame.quit() # 退出pygame
sys.exit() # 退出系统
if event.type ==MOUSEMOTION: # 获得鼠标当前的位置
print(event.pos)
if event.type ==MOUSEBUTTONDOWN: # 获得鼠标按下的位置
print("鼠标按下:",event.pos)
if event.type ==MOUSEBUTTONUP: # 获得鼠标抬起的位置
print("鼠标抬起:",event.pos)
if event.type == KEYDOWN: # 获得键盘按下的事件
if(event.key==K_UP or event.key==K_w):
print("上")
if(event.key==K_DOWN or event.key==K_s):
print("下")
if(event.key==K_LEFT or event.key==K_a):
print("左")
if(event.key==K_RIGHT or event.key==K_d):
print("右")
if(event.key==K_ESCAPE): # 按下键盘的Esc键退出
pygame.quit() # 退出pygame
sys.exit() # 退出系统
pygame.display.update() # 绘制屏幕内容
```
pygame学习更多:https://www.pygame.org/docs/
- 前言
- 第一章 树莓派快速入门
- 1. 初识树莓派3B+
- 2. 烧录系统
- 3. 树莓派连接键盘鼠标和显示器
- 4. 启动树莓派
- 5.树莓派连接网络
- 6. Windows远程访问树莓派
- 7. 终端通过raspi-config配置树莓派
- 第二章 树莓派编程
- 1. Linux入门操作
- 常用的linux命令
- 重要的快捷键
- 通过命令安装软件
- 树莓派关机/重启
- 2. 创建、编辑和保存文件
- 3. 创建并运行Python程序
- 4. 使用树莓派的GPIO口
- 第三章 树莓派套件应用
- 树莓派3B+ IO扩展板介绍
- 家居系统
- 会呼吸的RGB灯
- 树莓派控制家电
- 制作一个环境检测仪
- 树莓派摄像头做远程监控
- 摄像头使用
- socket通信
- PiCamera + socket远程监控
- AI语音
- 配置snowboy
- 自定义响应
- 采集语音和语音播放
- 语音机器人
- 图灵机器人
- 俄罗斯方块小游戏
- pygame基本使用
- ADKeyboard使用
- 俄罗斯方块实现原理
- 俄罗斯方块代码讲解
- 手势控制的树莓派相册
- 模块介绍
- 爬取图片
- 电子相册
- 附录
- 网址