pygame 游戏框架

  • 初识 pygame
    • 安装 pygame
    • pygame 常用模块
  • pygame 的基本使用(跳跃的小球游戏)

初识 pygame

pygame 是跨平台 Python 模块,专为电子游戏设计,包含图像、声音。创建在 SDL(Simple Direct Media Layer) 基础上,允许实时电子游戏研发而无需被低级语言、如 C 语言或是更低级的汇编语言束缚。基于这样一个设想,所有需要的游戏功能和理念都(主要是图像方便)完全简化为游戏逻辑本身,所有的资源就够都可以由 Python 提供。

安装 pygame

pygame 的安装非常简单,只需要一行命令:

pip install pygame

安装完后,检测以下是否安装成功,输入如下命令:

import pygame
pygame.ver

运行结果:

pygame 常用模块

用 pygame 做游戏开发的优势在于不需要过多地考虑底层相关的内容,而可以把工作重心放在游戏逻辑上。例如,pygame 中集成了很多和底层相关的模块,如访问显示设备、管理事件、使用字体等。pygame 的常用模块如图:

模块名 功能
pygame.cdrom 访问光驱
pygame.cursors 加载光标
pygame.display 访问显示设备
pygame.draw 绘制形状、线和点
pygame.event 管理事件
pygame.font 使用字体
pygame.imgae 加载和存储图片
pygame.joystick 使用游戏手柄或者类似的东西
pygame.key 读取键盘按键
pygame.mixer 声音
pygame.mouse 鼠标
pygame.movie 播放视频
pygame.music 播放音频
pygame.overlay 访问高级视频叠加
pygame.rect 管理矩形区域
pygame.sndarray 操作声音数据
pygame.sprite 操作移动图形
pygame.surface 管理图像和屏幕
pygame.surfarray 管理点阵图像数据
pygame.time 管理时间和帧信息
pygame.transform 缩放和移动图像

下面,使用 pygame 的 display 模块和 event 模块创建一个 pygame 窗口,代码如下:

# -*- coding:utf-8 -*-
import sys
import pygamepygame.init()   # 初始化 pygame
size = (width, height) = (300, 240)         # 设置窗口
screen = pygame.display.set_mode(size)  # 显示窗口# 执行死循环,确保窗口一直显示
while True:# 检查事件for event in pygame.event.get():    # 遍历所有事件if event.type == pygame.QUIT:   # 如果单击关闭窗口,则退出sys.exit()
pygame.quit()

运行效果:

pygame 的基本使用(跳跃的小球游戏)

实例:制作一个跳跃的小球游戏
创建一个游戏窗口,然后在窗口内创建一个小球。以一定的速度移动小球,当小球碰到游戏窗口的边缘时,小球弹回,继续移动。按照如下步骤实现:
(1)创建一个游戏窗口,宽和高设置为 640*480。代码如下:

import sys
import pygamepygame.init()       # 初始化pygame
size = (width, height) = (640, 480)     # 设置窗口
screen = pygame.display.set_mode(size)  # 显示窗口

上述代码中,首先导入 pygame 模块,然后调用 init() 方法初始化 pygame 模块。接下来,设置窗口的宽和高,最后使用 display 模块显示窗体。display 模块的常用方法如下:

方法名 功能
pygame.display.init 初始化 display 模块
pygame.display.quit 结束 display 模块
pygame.display.get_init 如果 display 模块已经被初始化,则返回 True
pygame.display.set_mode 初始化一个准备显示的界面
pygame.display.get_surface 获取当前的 surface 对象
pygame.display.flip 更新整个待显示的 surface 对象到屏幕上
pygame.display.update 更新部分内容显示到屏幕上,如果没有参数则与 flip 功能相同

(2)运行上述代码,会出现一个一闪而过的黑色窗口,这是因为程序执行完成后,会自动关闭。如果让窗口一直显示,需要使用 while True 语句让程序一直运行,此外,还需要设置关闭按钮。具体代码如下:

# -*- coding = UTF-8 -*-
import sys
import pygamepygame.init()       # 初始化pygame
size = (width, height) = (640, 480)     # 设置窗口
screen = pygame.display.set_mode(size)  # 显示窗口# 执行死循环,确保窗口一直显示
while True:# 检查事件for event in pygame.event.get():if event.type == pygame.QUIT:   # 如果单击关闭窗口,则退出sys.exit()
pygame.quit()       # 退出 pygame

上述代码中,添加了轮询事件检测。pygame.event.get() 方法能够获取事件队列,使用 for ··· in 语句遍历事件,然后根据 type 属性判断事件类型。这里的事件处理与 GUI 类似,如 event.type 等于 pygame.QUIT,表示检测到关闭 pygame 窗口事件;pygame.KEYDOWN 表示键盘按下事件,pygame.MOUSEBUTTONDOWN 表示鼠标按下事件等。

(3)在窗口中添加小球。先准备好一张 ball.png 图片,然后加载该图片,最后将图片显示在窗口中,具体代码如下:

# -*- coding = UTF-8 -*-
import sys
import pygamepygame.init()       # 初始化pygame
size = (width, height) = (640, 480)     # 设置窗口
screen = pygame.display.set_mode(size)  # 显示窗口
color = (0, 0, 0)   # 设置背景颜色
ball = pygame.image.load("ball.jpg")    # 加载图片,返回一个 Surface 对象
ballrect = ball.get_rect()      # 获取矩形区域# 执行死循环,确保窗口一直显示
while True:# 检查事件for event in pygame.event.get():if event.type == pygame.QUIT:   # 如果单击关闭窗口,则退出sys.exit()screen.fill(color)  # 填充颜色screen.blit(ball, ballrect) # 将图片画到窗口上pygame.display.flip()   # 更新全部显示pygame.quit()       # 退出 pygame

上书代码中使用 image 模块的 load() 方法加载图片,返回值 ball 是一个 Surface 对象Surface 是用来代表图片的 pygame 对象,可以对一个 Surface 对象进行涂画、变形、复制等各种操作。事实上,屏幕也只是一个 surface ,pygame.display.set_mode 就返回了一个屏幕 surface 对象。如果将 ball 这个 surface 对象画到 screen Surface 对象,需要使用 bilt() 方法,最后使用 display 模块的 flip 方法更新整个待显示的 Surface 对象到屏幕上。Surface 对象的常用方法如下:

方法名 功能
pygame.Surface.blit 将一个图像画到另一个图像上
pygame.Surface.convert 转换图片的像素格式
pygame.Surface.convert_alpha 转换图片的像素格式,包含 alpha 通道的转换
pygame.Surface.fill 使用颜色填充 Surface
pygame.Surface.get_rect 获取 Surface 的矩形区域

运行上述代码,结果如图所示:

(4)下面该让小球动起来了。ball.get_rect() 方法返回值 ballrect 是一个 Rect 对象,该对象有一个 move() 方法可以用于移动矩形。move(x,y) 函数有两个参数:第一个参数是 x 轴移动的距离;第二个参数是 y 轴移动的距离。窗体左上角坐标为 (0,0)。

为实现小球不停的移动,将 move() 函数添加到 while 循环内,代码如下:

# -*- coding = UTF-8 -*-
import sys
import pygamepygame.init()       # 初始化pygame
size = (width, height) = (640, 480)     # 设置窗口
screen = pygame.display.set_mode(size)  # 显示窗口
color = (0, 0, 0)   # 设置背景颜色
ball = pygame.image.load("ball.jpg") # 加载图片,返回一个 Surface 对象
ballrect = ball.get_rect()      # 获取矩形区域speed = [5, 5]  # 设置移动的 x 轴, y 轴距离
# 执行死循环,确保窗口一直显示
while True:# 检查事件for event in pygame.event.get():if event.type == pygame.QUIT:   # 如果单击关闭窗口,则退出sys.exit()ballrect = ballrect.move(speed)screen.fill(color)  # 填充颜色screen.blit(ball, ballrect) # 将图片画到窗口上pygame.display.flip()   # 更新全部显示pygame.quit()       # 退出 pygame

(5)运行上述代码,发现小球在屏幕中一闪而过,此时,小球没有真正消失,而是移动到了窗体之外,此时需要添加碰撞检测的功能。当小球与窗体任一边缘发生碰撞,则更改小球的移动方向。具体代码如下:

# -*- coding = UTF-8 -*-
import sys
import pygamepygame.init()       # 初始化pygame
size = (width, height) = (640, 480)     # 设置窗口
screen = pygame.display.set_mode(size)  # 显示窗口
color = (0, 0, 0)   # 设置背景颜色ball = pygame.image.load("ball.jpg") # 加载图片,返回一个 Surface 对象ballrect = ball.get_rect()      # 获取矩形区域speed = [5, 5]  # 设置移动的 x 轴, y 轴距离
# 执行死循环,确保窗口一直显示
while True:# 检查事件for event in pygame.event.get():if event.type == pygame.QUIT:   # 如果单击关闭窗口,则退出sys.exit()ballrect = ballrect.move(speed)  # 移动小球# 碰到左右边缘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(color)  # 填充颜色screen.blit(ball, ballrect) # 将图片画到窗口上pygame.display.flip()   # 更新全部显示pygame.quit()       # 退出 pygame

(6)运行上述代码,发现好像有多个小球在飞快移动,这是因为运行上述代码的时间非常短,导致肉眼观察出现错觉,因此需要添加一个“时钟”来控制程序运行的时间。这时就需要使用 pygame 的 time 模块。使用 pygame 时钟之前,必须先创建 Clock 对象的一个实例,然后在 while 循环中 设置多长时间运行一次。
具体代码如下:

# -*- coding = UTF-8 -*-
import sys
import pygamepygame.init()       # 初始化pygame
size = (width, height) = (640, 480)     # 设置窗口
screen = pygame.display.set_mode(size)  # 显示窗口
color = (0, 0, 0)   # 设置背景颜色ball = pygame.image.load("ball.jpg") # 加载图片,返回一个 Surface 对象
ballrect = ball.get_rect()      # 获取矩形区域speed = [5, 5]  # 设置移动的 x 轴, y 轴距离
clock = pygame.time.Clock() # 设置时钟# 执行死循环,确保窗口一直显示
while True:clock.tick(60)  # 每秒执行60次# 检查事件for event in pygame.event.get():if event.type == pygame.QUIT:   # 如果单击关闭窗口,则退出sys.exit()ballrect = ballrect.move(speed)  # 移动小球# 碰到左右边缘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(color)  # 填充颜色screen.blit(ball, ballrect) # 将图片画到窗口上pygame.display.flip()   # 更新全部显示pygame.quit()       # 退出 pygame

至此,完成了“跳跃的小球”游戏。

【Python笔记】pygame 游戏框架相关推荐

  1. Python的Pygame游戏框架(汇总)

    Python的Pygame游戏框架 一.前言 二.初识pygame 1.安装pygame 2.pygame 常用模块 二.Pygame 的基础使用 三.手写小游戏源码下载 一.前言 个人主页: ζ小菜 ...

  2. Python基础-Pygame游戏框架之飞机大战

    Pygame游戏框架 Pygame Pygame是一套跨平台的Python模块,专为编写游戏而设计. 它包括计算机图形和声音库,旨在与Python编程语言一起使用. 展示窗体 引入pygame模块 i ...

  3. 《Python和Pygame游戏开发指南》——2.16 pygame.display.update()函数

    本节书摘来自异步社区<Python和Pygame游戏开发指南>一书中的第2章,第2.16节,作者[美]Al Sweigart(斯维加特), 李强 译,更多章节内容可以访问云栖社区" ...

  4. 《Python和Pygame游戏开发指南》——1.12 图书中的文本折行

    本节书摘来自异步社区<Python和Pygame游戏开发指南>一书中的第1章,第1.12节,作者[美]Al Sweigart(斯维加特), 李强 译,更多章节内容可以访问云栖社区" ...

  5. python和pygame游戏开发指南_学习记录

    <python和pygame游戏开发指南> Making Games With Python and Palme [美]Ai Sweigart 著,李强 译,2015.12第一版 文章目录 ...

  6. python的pygame游戏开始结束信息_从0开始学python第14.8节-pygame射击游戏(一)

    我们在pycharm里新建一个工程,起名字为star-wars.工程创建好后,我们新建一个src文件夹用来存放代码.接下来在src下创建Main.py,代码如下:import pygame from ...

  7. python方向键控制角色_用python和pygame游戏编程入门-控制角色移动

    在上一节中我们知道了事件,以及如何捕捉键盘事件进行响应,本届我们结合第一节何上一节的内容,做一个用键盘控制角色移动的功能,代码如下: #!/usr/bin/env python #指定图像文件名称 b ...

  8. python怎么窗口显示文字_用python和pygame游戏编程入门-显示文字

    上一节我们通过键盘可以控制角色移动,如果要让角色说话,那就要用到文字显示.Pygame可以直接调用系统字体,或者也可以使用TTF字体,TTF就是字体文件,可以从网上下载.为了使用字体,你得先创建一个F ...

  9. python 开发框架 ant_GitHub - forging2012/pymqant: python版本mqant游戏框架

    mqant mqant是一款基于Golang语言的简洁,高效,高性能的分布式游戏服务器框架,研发的初衷是要实现一款能支持高并发,高性能,高实时性,的游戏服务器框架,也希望mqant未来能够做即时通讯和 ...

最新文章

  1. uni-app 之 使用扩展组件(uni ui) Pagination 分页器使用示例
  2. 【Java】枚举(enum)机制 详解
  3. oracle导入到mysql命令_oracle数据库导入导出命令
  4. 美团mysql 闪回_MyFlash——美团点评的开源MySQL闪回工具
  5. 通过 html5 FileReader 实现上传图片预览功能
  6. python中uniform randint_python生成随机数:uniform(), randint(), gauss(), expovariate()
  7. 今天第一次开通blog
  8. 爱因斯坦一生最伟大的问候
  9. redis学习-NoSQL数据库的四大分类
  10. Petal Search is currently only available
  11. Spring boot+Thymeleaf+easyui集成:js创建组件页面报错
  12. 初步学习Django-第五篇:ORM详解
  13. 项目现场如何通过安防网络设备的EHOME协议,把设备接入EasyCVR平台上进行互联网直播及分发?
  14. 记一次FileZillaServer提权
  15. 人脸识别智能门禁D508也能“码”上开门
  16. DQN玩Atari游戏安装atari环境bug指南
  17. GB2312介绍及字库使用
  18. 72、公安网络视频监控系统解决方案
  19. C语言 字符串-字符串的复制
  20. 堡垒之夜 服务器显示离线,堡垒之夜怎么是离线状态 | 手游网游页游攻略大全...

热门文章

  1. 路由器长期通电好不好?
  2. 苹果手机扩容对手机好不好?
  3. Ubuntu配置教程
  4. HTML中常见问题汇总贴
  5. 自动网络搜索(NAS)的理解
  6. dibbler-server安装配置
  7. c# mysql数据集_C#第四次作业:MySQL数据库及C#操作MySQL数据库
  8. sql表格模型获取记录内容_SQL Server和BI –如何使用Excel记录表格模型
  9. t–sql pl–sql_SQL Server性能疑难解答的DBA指南–第2部分–监视实用程序
  10. mysql屏蔽_MySQL中的企业数据屏蔽