python Pygame的具体使用讲解

一、实验介绍

1.1 实验内容

在本节课中,我们将讲解Pygame的常用对象及其操作,包括图形、动画、文字、音频等,确保同学们对Pygame有一个基础的了解,同时为后续课程做好准备。

1.2 实验知识点

  1. Pygame图形
  2. Pygame动画
  3. Pygame文字
  4. Pygame音频
  5. Pygame事件

1.3 实验环境

  1. Python 2.7.6
  2. Xfce终端

1.4 适合人群

本课程难度为一般,属于初级级别课程,适合具有Python基础的用户,熟悉Python基础知识加深巩固。

1.5 代码获取

本节实验所用到的代码和相关资源文件可以通过下面命令下载到实验楼环境中,作为参照对比进行学习。

$ wget http://labfile.oss.aliyuncs.com/courses/940/foundation.zip

解压缩至 /home/shiyanlou/foundation :

$ unzip foundation.zip

二、开发准备

本次课程主要利用Pygame模块来进行开发,首先我们需要打开Xfce终端,并使用 pip 命令来安装Pygame

$ sudo 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:
      # 退出pygame
      pygame.quit()
      # 退出系统
      sys.exit()

  # 绘制屏幕内容
  pygame.display.update()

效果图如下:

这里解释一下上面程序的运行方式

一个游戏循环(也可以称为主循环)就做下面这三件事:

  1. 处理事件
  2. 更新游戏状态
  3. 绘制游戏状态到屏幕上

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)此方法用于绘制一个圆

以下为示例代码:

# -*- coding: UTF-8 -*-
# drawing.py

# 导入需要的模块
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:
      # 退出pygame
      pygame.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('resources/shiyanlou.PNG')

# 初始化图片的位置
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()

  # 设置pygame时钟的间隔时间
  fpsClock.tick(FPS)

效果图如下:

3.4 绘制文字

如果你想绘制文字到屏幕上,Pygame提供了很方便的方法使用.ttf字体文件,这样我们就能很轻易的将文字绘制在屏幕上了。

这里我使用了ARBERKLEY.ttf作为字体,字体文件的获取请参考1.5代码获取。

主要用到的方法:

pygame.font.Font(filename, size)

filename:字体文件的文件名;

size:字体的高height,单位为像素;

pygame.font.Font.render(text, antialias, color, background=None)

text:要显示的文字;

antialias: 是否抗锯齿;

color:字体颜色;

background:背景颜色(可选参数);

.get_rect()

获得一个对象的rect,以便于设置其坐标位置

以下为示例代码:

# -*- coding: UTF-8 -*-
# font.py

# 导入需要的模块
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:
      # 退出pygame
      pygame.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)

# 加载并播放一个特效音频文件(所用到的音频文件请参考1.5代码获取)
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()
      # 退出pygame
      pygame.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:
      # 退出pygame
      pygame.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):
        # 退出pygame
        pygame.quit()
        # 退出系统
        sys.exit()

  # 绘制屏幕内容
  pygame.display.update()

效果图如下:

四、实验总结

本节课程我们主要讲解了Pygame的一些常用对象及操作,这些都是我们后续课程需要用到的知识点,希望同学们能熟练掌握这些内容。若想要深入了解,可参考下方Pygame官方文档的链接。

五、参考链接

Pygame官方文档

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • python使用PyGame绘制图像并保存为图片文件的方法

    本文实例讲述了python使用PyGame绘制图像并保存为图片文件的方法.分享给大家供大家参考.具体实现方法如下: ''' pg_draw_circle_save101.py draw a blue solid circle on a white background save the drawing to an image file for result see http://prntscr.com/156wxi tested with Python 2.7 and PyGame 1.9.2

  • 用Python写飞机大战游戏之pygame入门(4):获取鼠标的位置及运动

    目标是拷贝微信的飞机大战,当然拷贝完以后大家就具备自己添加不同内容的能力了. 首先是要拿到一些图片素材,熟悉使用图像处理软件和绘画的人可以自己制作,并没有这项技能的同学只能和我一样从网上下载相应的素材了. 网上可以找到相应的这样的图片,注意,所有的元件图片要是png类型的图片,那样可以有透明的背景,否则会有白色的边框露出来. 找到素材以后我们就要开始搭建我们的飞机大战了. 微信上的飞机大战是由手指控制的,在电脑上,我们就先用鼠标代替了. 按照之前我们在天空上移动云的那个程序,我们可以知道该怎么做

  • 安装Python和pygame及相应的环境变量配置(图文教程)

    Hello,Everyone! Python是个好东西!好吧,以黎某人这寒碜的赞美之词,实在上不了台面,望见谅.那我们直接来上干货吧. 第一步:下载Python安装包https://www.python.org/ 1.进入Python官网,点击download 2.进入之后有两个安装包供选择(Python会根据你系统的位数智能选择,所以这里不用纠结你的电脑是32位的还是64位) 我的建议是下载Python3.0后面的版本,因为Python3在Python2的基础上,优化改进了一些代码格式.点击下

  • python使用PyGame模块播放声音的方法

    本文实例讲述了python使用PyGame模块播放声音的方法.分享给大家供大家参考.具体实现方法如下: import pygame pygame.init() pygame.mixer.music.load("sound_file.ogg") pygame.mixer.music.play() pygame.event.wait() 希望本文所述对大家的Python程序设计有所帮助.

  • python中pygame针对游戏窗口的显示方法实例分析(附源码)

    本文实例讲述了python中pygame针对游戏窗口的显示方法.分享给大家供大家参考,具体如下: 在这篇教程中,我将给出一个demo演示: 当我们按下键盘的'f'键的时候,演示的窗口会切换到全屏显示和默认显示两种显示模式 并且在后台我们可以看到相关的信息输出: 上面给出了一个简单的例子,当然在pygame的官方文档中有对显示策略的更权威的说明: http://www.pygame.org/docs/ref/display.html#pygame.display.set_mode ''' pyga

  • Python中pygame安装方法图文详解

    本文实例讲述了Python中pygame安装方法.分享给大家供大家参考,具体如下: 这里主要描述一下我们怎样来安装pygame 可能很多人像我一样,发现了pygame是个好东东,但是就是不知道怎样使用,或者怎样安装,在百度/google上面搜索了一番后,发现没有一篇 详细描述pygame的安装过程的文章.如果你是其中的一员,那么这篇教程可能会帮助到你. 当然,在学习pygame的时候,需要你要有一定的python基础知识的.如果你已经具备了一定的python基础,那么接下来的内容可能对你来说就很

  • python中pygame模块用法实例

    本文实例讲述了python中pygame模块用法,分享给大家供大家参考.具体方法如下: import pygame, sys from pygame.locals import * #set up pygame pygame.init() windowSurface = pygame.display.set_mode((500, 400), 0, 32) pygame.display.set_caption("hello, world") BLACK = (0, 0, 0) WHITE

  • python Pygame的具体使用讲解

    一.实验介绍 1.1 实验内容 在本节课中,我们将讲解Pygame的常用对象及其操作,包括图形.动画.文字.音频等,确保同学们对Pygame有一个基础的了解,同时为后续课程做好准备. 1.2 实验知识点 Pygame图形 Pygame动画 Pygame文字 Pygame音频 Pygame事件 1.3 实验环境 Python 2.7.6 Xfce终端 1.4 适合人群 本课程难度为一般,属于初级级别课程,适合具有Python基础的用户,熟悉Python基础知识加深巩固. 1.5 代码获取 本节实验

  • python飞机大战游戏实例讲解

    记得刚学python那会,作过一个飞机大战小项目,这个项目非常经典,可以帮助初学者提高动手能力,今天把它分享出来. 一.项目介绍 先放几张图片 二.项目实现 1.首先安装库 pip install pygame 2.主要python代码 import pygame from pygame.locals import * import random #https://blog.csdn.net/qq_36079986/article/details/110395731 class HeroPlan

  • Python Pygame实战之水果忍者游戏的实现

    目录 一.准备中 1.0游戏规则 1.1游戏图片素材(可修改) 1.2游戏字体素材(可修改) 二.环境安装 三.开始敲代码 3.0设置界面玩家生命值等 3.1导入模块 3.2界面背景.字体设置 3.3游戏窗口设置 3.4随机生成水果的位置与数据存放 3.5用一个字典来存放水果的数据 3.6在屏幕中绘制字体 3.7绘制玩家的生命 3.8游戏开始与结束画面 3.9游戏主循环 四.游戏展示效果 导语 Hey!下午好,我是木木子,关注我,一起玩游戏吧~ ​ ​微信小游戏很久之前刮起了一股切水果热潮,还记

  • Python Pygame实战之飞机大战的实现

    目录 导语 一.环境安装 1)各种素材(图片.字体等) 2)运行环境 二.代码展示 1)文章思路 2)附代码讲解 3)主程序 三.效果展示 总结 导语 三月疫情原因,很多地方都封闭式管理了! 在回家无聊的打酱油,小编今天给大伙带来了一波小游戏——全民左右飞机大战!在这个快熬不下去的日子里,打打飞机消遣闲暇时间,也是蛮惬意的,这几天小编必须全身心投入到飞机大战中来!肝了几天这款小游戏终于面市啦! 这次的游戏操作很简单,就是左右移动飞机,躲避敌人飞机,打落敌机会随机掉落金币,我们 要打击的敌人!每个

  • Python 模拟购物车的实例讲解

    1.功能简介 此程序模拟用户登陆商城后购买商品操作.可实现用户登陆.商品购买.历史消费记查询.余额和消费信息更新等功能.首次登陆输入初始账户资金,后续登陆则从文件获取上次消费后的余额,每次购买商品后会扣除相应金额并更新余额信息,退出时也会将余额和消费记录更新到文件以备后续查询. 2.实现方法 架构: 本程序采用python语言编写,将各项任务进行分解并定义对应的函数来处理,从而使程序结构清晰明了.主要编写了六个函数: (1)login(name,password) 用户登陆函数,实现用户名和密码

  • Python文件和流(实例讲解)

    1.文件写入 #打开文件,路径不对会报错 f = open(r"C:\Users\jm\Desktop\pyfile.txt","w") f.write("Hello,world!\n") f.close() 2.文件读取 #读取 f = open(r"C:\Users\jm\Desktop\pyfile.txt","r") print(f.read()) f.close() 输出: Hello,world

  • python之Character string(实例讲解)

    1.python字符串 字符串是 Python 中最常用的数据类型.我们可以使用引号('或")来创建字符串,l Python不支持单字符类型,单字符也在Python也是作为一个字符串使用. >>> var1 = 'hello python' #定义字符串 >>> print(var1[0]) #切片截取,从0开始,不包括截取尾数 h >>> print(var1[0:5]) hello >>> print(var1[-6:]

  • Python实现购物系统(示例讲解)

    要求: 用户入口 1.商品信息存在文件里 2.已购商品,余额记录. 商家入口 可以添加商品,修改商品价格 Code: 商家入口: # Author:P J J import os ps = ''' 1 >>>>>> 修改商品 2 >>>>>> 添加商品 按q为退出程序 ''' # 打开两个文件,f文件为原来存取商品文件,f_new文件为修改后的商品文件 f = open('commodit', 'r', encoding='utf-8

  • python用户管理系统的实例讲解

    学Python这么久了,第一次写一个这么多的代码(我承认只有300多行,重复的代码挺多的,我承认我确实垃圾),但是也挺不容易的 自定义函数+装饰器,每一个模块写的一个函数 很多地方能用装饰器(逻辑跟不上,有的地方没用),包括双层装饰器(不会),很多地方需要优化,重复代码太多 我还是把我的流程图拿出来吧,虽然看着比上次的垃圾,但是我也做了一个小时,不容易! 好像是挺丑的(表示不会画,但我下次一定努力) 用户文件: 文件名为:user.txt 1代表管理员用户 2代表普通用户 smelond|adm

  • 在Windows中设置Python环境变量的实例讲解

    在 Windows 设置环境变量 在环境变量中添加Python目录: 在命令提示框中(cmd) : 输入 path=%path%;C:\Python 按下"Enter". 注意: C:\Python 是Python的安装目录. 也可以通过以下方式设置: • 右键点击"计算机",然后点击"属性" • 然后点击"高级系统设置" • 选择"系统变量"窗口下面的"Path",双击即可! • 然后

随机推荐