python Pygame的具体使用讲解
一、实验介绍
1.1 实验内容
在本节课中,我们将讲解Pygame的常用对象及其操作,包括图形、动画、文字、音频等,确保同学们对Pygame有一个基础的了解,同时为后续课程做好准备。
- Pygame图形
- Pygame动画
- Pygame文字
- Pygame音频
- Pygame事件
1.2 实验环境
- window10
- python 3.8
二、开发准备
本次主要利用Pygame模块来进行开发,首先我们需要打开Xfce终端,并使用 pip 命令来安装Pygame
pip install pygame
安装完成之后进入Python的交互界面,输入以下命令查看是否成功安装。
import pygame
若无异常,则说明安装成功。
三、实验步骤
3.1 HelloWorld
首先开始我们第一个HelloWorld程序:
# -*- coding: UTF-8 -*-
# helloworld.py# 导入所需的模块
import pygame, sys
# 导入所有pygame.locals里的变量(比如下面大写的QUIT变量)
from pygame.locals import *# 初始化pygame
pygame.init()# 设置窗口的大小,单位为像素
screen = pygame.display.set_mode((500, 400))# 设置窗口标题
pygame.display.set_caption('Hello World')# 程序主循环
while True:# 获取事件for event in pygame.event.get():# 判断事件是否为退出事件if event.type == QUIT:# 退出pygamepygame.quit()# 退出系统sys.exit()# 绘制屏幕内容pygame.display.update()
效果图如下:
这里解释一下上面程序的运行方式
一个游戏循环(也可以称为主循环)就做下面这三件事:
- 处理事件
- 更新游戏状态
- 绘制游戏状态到屏幕上
3.2 绘制图形
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)此方法用于绘制一个椭圆
pygame.draw.ellipse(Surface, color, Rect, width)此方法用于绘制一个椭圆框
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)此方法用于绘制一个圆
以下为示例代码:
# 导入需要的模块
import pygame, sys
from pygame.locals import *
from math import pi# 初始化pygame
pygame.init()# 设置窗口的大小,单位为像素
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.ellipse(screen, RED, [225, 10, 50, 20], 2)# 绘制一个椭圆
pygame.draw.ellipse(screen, RED, [300, 10, 50, 20])# 绘制多边形
pygame.draw.polygon(screen, BLACK, [[100, 100], [0, 200], [200, 200]], 5)# 绘制多条弧线
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:# 退出pygamepygame.quit()# 退出系统sys.exit()# 绘制屏幕内容pygame.display.update()
效果图如下:
3.3 实现动画
由于人类眼睛的特殊生理结构,当所看画面的帧率高于24的时候,就会认为是连贯的,此现象称之为 视觉暂留 。
帧率(Frame rate)是用于测量显示帧数的量度,所谓的测量单位为每秒显示帧数(Frames per Second,简称:FPS)
一般来说30fps是可以接受的,但是将性能提升至60fps则可以明显提升交互感和逼真感,但是一般来说超过75fps一般就不容易察觉到有明显的流畅度提升了。
在我们原有坐标系的基础上添加偏移量,再重新绘制,依次一张一张的循环绘制下去,就会得到我们想要的物体移动的效果。
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时钟的间隔时间
以下为示例代码:
# -*- coding: UTF-8 -*-
# animation.py# 导入需要的模块
import pygame, sys
from pygame.locals import *# 初始化pygame
pygame.init()# 设置帧率(屏幕每秒刷新的次数)
FPS = 30# 获得pygame的时钟
fpsClock = pygame.time.Clock()# 设置窗口大小
screen = pygame.display.set_mode((500, 400), 0, 32)# 设置标题
pygame.display.set_caption('Animation')# 定义颜色
WHITE = (255, 255, 255)# 加载一张图片(所用到的的图片请参考1.5代码获取)
img = pygame.image.load('image/242.png')# 初始化图片的位置
imgx = 10
imgy = 10# 初始化图片的移动方向
direction = 'right'# 程序主循环
while True:# 每次都要重新绘制背景白色screen.fill(WHITE)# 判断移动的方向,并对相应的坐标做加减if direction == 'right':imgx += 5if imgx == 380:direction = 'down'elif direction == 'down':imgy += 5if imgy == 300:direction = 'left'elif direction == 'left':imgx -= 5if imgx == 10:direction = 'up'elif direction == 'up':imgy -= 5if 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()# 设置pygame时钟的间隔时间fpsClock.tick(FPS)
效果图如下:
3.4 绘制文字
如果你想绘制文字到屏幕上,Pygame提供了很方便的方法使用.ttf字体文件,这样我们就能很轻易的将文字绘制在屏幕上了。
主要用到的方法:
pygame.font.Font(filename, size)
filename:字体文件的文件名;
size:字体的高height,单位为像素;
pygame.font.Font.render(text, antialias, color, background=None)
text:要显示的文字;
antialias: 是否抗锯齿;
color:字体颜色;
background:背景颜色(可选参数);
.get_rect()
获得一个对象的rect,以便于设置其坐标位置
以下为示例代码:
# 导入需要的模块
import pygame, sys
from pygame.locals import *# 初始化pygame
pygame.init()# 设置窗口的大小,单位为像素
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)# 获得要显示的对象的rect
textRectObj = textSurfaceObj.get_rect()# 设置显示对象的坐标
textRectObj.center = (250, 200)# 设置背景
screen.fill(WHITE)# 绘制字体
screen.blit(textSurfaceObj, textRectObj)# 程序主循环
while True:# 获取事件for event in pygame.event.get():# 判断事件是否为退出事件if event.type == QUIT:# 退出pygamepygame.quit()# 退出系统sys.exit()# 绘制屏幕内容pygame.display.update()
效果图如下:
3.5 播放音频
在Pygame里播放音频有两个方法,一个用来播放特效声音,一个用来播放背景音乐:
pygame.mixer.Sound(filename)
该方法返回一个Sound对象,调用它的.play( )方法,即可播放较短的音频文件(比如玩家受到伤害、收集到金币等);
pygame.mixer.music.load(filename)
该方法用来加载背景音乐,之后调用pygame.mixer.music.play( )方法就可以播放背景音乐(Pygame只允许加载一个背景音乐在同一个时刻)
以下为示例代码:
# -*- coding: UTF-8 -*-
# audio.py# 导入需要的模块
import pygame, sys
from pygame.locals import *# 初始化pygame
pygame.init()# 设置窗口的大小,单位为像素
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')
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()# 退出pygamepygame.quit()# 退出系统sys.exit()# 绘制屏幕内容pygame.display.update()
3.6 事件
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 |
以下为示例代码:
# -*- coding: UTF-8 -*-
# event.py# 导入需要的模块
import pygame, sys
from pygame.locals import *# 定义颜色
WHITE = (255, 255, 255)# 初始化pygame
pygame.init()# 设置窗口的大小,单位为像素
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:# 退出pygamepygame.quit()# 退出系统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("右")# 按下键盘的Esc键退出if(event.key==K_ESCAPE):# 退出pygamepygame.quit()# 退出系统sys.exit()# 绘制屏幕内容pygame.display.update()
效果图如下:
四、实验总结
本节课程我们主要讲解了Pygame的一些常用对象及操作,这些都是我们后续课程需要用到的知识点,希望同学们能熟练掌握这些内容。若想要深入了解,可参考下方Pygame官方文档的链接。
python Pygame的具体使用讲解相关推荐
- Python pygame 坦克大战
Python pygame 坦克大战 import pygame, time, random from pygame.sprite import SpriteSCREEN_WIDTH = 750 SC ...
- PYTHON pygame库实战——实现双人弹球小游戏
PYTHON pygame实战--运用pygame库实现双人弹球小游戏 使用python pygame库实现一个双人弹球小游戏,两人分别控制一个左右移动的挡板用来拦截小球,小球会在两板间不停弹跳,拦截 ...
- python pygame 简单小游戏
python pygame 简单小游戏 最近学习了pygame,感觉十分有意思,花了一点时间制作了一个简单的小游戏 效果图 这是一个很简单的防守类小游戏 玩家可以使用wasd控制人物移动,并且鼠标控制 ...
- 保姆级教学——Python+Pygame怎么实现吃豆豆游戏
耽搁十几天的时间,我顺利的从阳转阴啦, 以后的日子一切恢复正常,好好工作,积极分享.希望在座的小伙伴阳了的全部健康转阴,没阳的全部不会变阳,新的一年,一切顺顺利利. 不知道最近大家学习得怎么样?有没有 ...
- 小甲鱼python游戏代码_【小甲鱼】零基础学习python pygame 飞机大战可执行源代码...
[实例简介] [小甲鱼]零基础学习python pygame 飞机大战可执行源代码,觉得挺有意思,故此分享. [实例截图] [核心代码] 飞机大战 └── 飞机大战 ├── bullet.py ├── ...
- Oracle语法求水仙花数,python实现水仙花数实例讲解
1.什么是水仙花数? 水仙花数(Narcissistic number)也被称为超完全数字不变数(pluperfect digital invariant, PPDI).自恋数.自幂数.阿姆斯壮数或阿 ...
- Python之统计作图函数讲解(三)
Python之统计作图函数讲解(三) 统计作图函数讲解 绘制曲线图plot() 绘制饼形图 二维条形直方图 绘制箱型图 统计作图函数讲解 Python统计作图主要库是Matplotlib,而Panda ...
- python +pygame 制作五子连珠小游戏
python +pygame 制作五子连珠小游戏 学习python半年了,今天分享一个利用pygame制作的五子连珠游戏. 一.代码: 1.球类,ball.py """ ...
- python数据分析的回归方程的简单讲解
python数据分析的回归方程的简单讲解(第一种手动实现, 第二种导入库实现) 文章目录 python数据分析的回归方程的简单讲解(第一种手动实现, 第二种导入库实现) 一.使用步骤 1.第一种手动实 ...
最新文章
- 免费报名 | 机器学习的第二次入门(入群有福利)
- oozie的作业调度
- learnpython有中文版吗_简介 | Learn Python the Hard Way 中文版
- [BOI2019][第K大问题][暴力剪枝]D2T1 Olympiads
- 第14天学习Java的笔记(成员变量和局部变量)
- win2008一键配置php mysql_Windows 2008一键安装包配置环境:Windows+IIS+Php+Mysql
- TextView实现自动滚动滚动.
- OpenCL 第8课:旋转变换(2)
- mysql 5.6.41-winx64,Mysql-5.6.41内存爆满一例
- logging 模块 与 logging 固定模块
- linux httpd 自动启动,在Linux启动时让Apache也自动启动
- Web Application Projects的一个问题
- Linux web服务与HTTP协议基础概念
- Paddle实现NLP-文本分类
- zbbz插件使用教程_CAD坐标自动标注zbbz插件非常实用(附压缩包及安装步骤)
- 关于邮件模板的兼容性1
- python 工程结构加固_gb50367 2013免费下载|混凝土结构加固设计规范GB50367-2013pdf高清电子版免费下载-东坡下载...
- ideaIU-2019.2.4版安装
- svn版本回退(CornerStone)
- 稳压二极管_百度百科
热门文章
- STC89C52的四个 外部中断 基本使用方法
- OpenHarmony鸿蒙相关资料
- BPF编程-使用libbpf-bootstrap构建BPF应用程序【译】
- 计算机音乐b型谱简单,《神奇秘谱》琴曲的调弦法
- 10个超棒的界面设计工具
- gitlab Enter passphrase for key
- 511遇见易语言调用百度OCR文字在线本地识别及游戏画面时时识别
- cleintHeight、offsetHeight、scrollHeight、cleintTop、offsetTop、scrollTop、getClientRects、getBoundingClien
- 技术分析:苹果之后 HTML5将改变移动互联网
- JavaScript实现双色球随机一注