一、实验介绍

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的具体使用讲解相关推荐

  1. Python pygame 坦克大战

    Python pygame 坦克大战 import pygame, time, random from pygame.sprite import SpriteSCREEN_WIDTH = 750 SC ...

  2. PYTHON pygame库实战——实现双人弹球小游戏

    PYTHON pygame实战--运用pygame库实现双人弹球小游戏 使用python pygame库实现一个双人弹球小游戏,两人分别控制一个左右移动的挡板用来拦截小球,小球会在两板间不停弹跳,拦截 ...

  3. python pygame 简单小游戏

    python pygame 简单小游戏 最近学习了pygame,感觉十分有意思,花了一点时间制作了一个简单的小游戏 效果图 这是一个很简单的防守类小游戏 玩家可以使用wasd控制人物移动,并且鼠标控制 ...

  4. 保姆级教学——Python+Pygame怎么实现吃豆豆游戏

    耽搁十几天的时间,我顺利的从阳转阴啦, 以后的日子一切恢复正常,好好工作,积极分享.希望在座的小伙伴阳了的全部健康转阴,没阳的全部不会变阳,新的一年,一切顺顺利利. 不知道最近大家学习得怎么样?有没有 ...

  5. 小甲鱼python游戏代码_【小甲鱼】零基础学习python pygame 飞机大战可执行源代码...

    [实例简介] [小甲鱼]零基础学习python pygame 飞机大战可执行源代码,觉得挺有意思,故此分享. [实例截图] [核心代码] 飞机大战 └── 飞机大战 ├── bullet.py ├── ...

  6. Oracle语法求水仙花数,python实现水仙花数实例讲解

    1.什么是水仙花数? 水仙花数(Narcissistic number)也被称为超完全数字不变数(pluperfect digital invariant, PPDI).自恋数.自幂数.阿姆斯壮数或阿 ...

  7. Python之统计作图函数讲解(三)

    Python之统计作图函数讲解(三) 统计作图函数讲解 绘制曲线图plot() 绘制饼形图 二维条形直方图 绘制箱型图 统计作图函数讲解 Python统计作图主要库是Matplotlib,而Panda ...

  8. python +pygame 制作五子连珠小游戏

    python +pygame 制作五子连珠小游戏 学习python半年了,今天分享一个利用pygame制作的五子连珠游戏. 一.代码: 1.球类,ball.py """ ...

  9. python数据分析的回归方程的简单讲解

    python数据分析的回归方程的简单讲解(第一种手动实现, 第二种导入库实现) 文章目录 python数据分析的回归方程的简单讲解(第一种手动实现, 第二种导入库实现) 一.使用步骤 1.第一种手动实 ...

最新文章

  1. 免费报名 | 机器学习的第二次入门(入群有福利)
  2. oozie的作业调度
  3. learnpython有中文版吗_简介 | Learn Python the Hard Way 中文版
  4. [BOI2019][第K大问题][暴力剪枝]D2T1 Olympiads
  5. 第14天学习Java的笔记(成员变量和局部变量)
  6. win2008一键配置php mysql_Windows 2008一键安装包配置环境:Windows+IIS+Php+Mysql
  7. TextView实现自动滚动滚动.
  8. OpenCL 第8课:旋转变换(2)
  9. mysql 5.6.41-winx64,Mysql-5.6.41内存爆满一例
  10. logging 模块 与 logging 固定模块
  11. linux httpd 自动启动,在Linux启动时让Apache也自动启动
  12. Web Application Projects的一个问题
  13. Linux web服务与HTTP协议基础概念
  14. Paddle实现NLP-文本分类
  15. zbbz插件使用教程_CAD坐标自动标注zbbz插件非常实用(附压缩包及安装步骤)
  16. 关于邮件模板的兼容性1
  17. python 工程结构加固_gb50367 2013免费下载|混凝土结构加固设计规范GB50367-2013pdf高清电子版免费下载-东坡下载...
  18. ideaIU-2019.2.4版安装
  19. svn版本回退(CornerStone)
  20. 稳压二极管_百度百科

热门文章

  1. STC89C52的四个 外部中断 基本使用方法
  2. OpenHarmony鸿蒙相关资料
  3. BPF编程-使用libbpf-bootstrap构建BPF应用程序【译】
  4. 计算机音乐b型谱简单,《神奇秘谱》琴曲的调弦法
  5. 10个超棒的界面设计工具
  6. gitlab Enter passphrase for key
  7. 511遇见易语言调用百度OCR文字在线本地识别及游戏画面时时识别
  8. cleintHeight、offsetHeight、scrollHeight、cleintTop、offsetTop、scrollTop、getClientRects、getBoundingClien
  9. 技术分析:苹果之后 HTML5将改变移动互联网
  10. JavaScript实现双色球随机一注