Pygame教程系列一:快速入门篇

article/2025/10/3 17:32:24

【简介】

Pygame 是python用来开发视频游戏的游戏引擎,底层主要是SDL库实现,算是目前利用python开发小游戏的一个性能比较高的一个游戏框架

一、安装pygame

使用pip下载安装

pip install pygame

二、入门案例详析

1、示例效果

在这里插入图片描述

2、示例代码

import os
import pygame
# 标识是否退出循环
exitFlag = False
# 设置画面刷新的帧率,即1s内刷新几次
FPS = 10
# 初始化pygame游戏引擎
pygame.init()
# 指定窗口的坐标(x,y),默认屏幕中央
os.environ['SDL_VIDEO_WINDOW_POS'] = "%d,%d" % (0, 25)
# 设置窗口大小
surface = pygame.display.set_mode((800, 500))
# 设置窗口标题
pygame.display.set_caption("pygame教程")
# 设置icon
icon = pygame.image.load('E:\AS-workspace\pygameTest\drawable\icon.png').convert_alpha()
pygame.display.set_icon(icon)
# 加载本地图片
bgSurface = pygame.image.load('E:\AS-workspace\pygameTest\drawable\BG.jpg').convert()
# 获取游戏时钟
clock = pygame.time.Clock()
# 图片缩放
scaleImg = pygame.transform.scale(icon, (400, 400))
# 获取图片的矩形框
rect = scaleImg.get_rect()
# 移动步长
step = 10
# 绘制背景
surface.blit(bgSurface,(0,0))
# 刷新帧率
newRect = None
while not exitFlag:clock.tick(FPS)# 重新绘制背景指定区域,等同于擦除图片效果if rect:surface.blit(bgSurface, rect,rect)# 图片移动指定步长newRect = rect.move(step, 0)# 弹出事件,这个一定要写,要不事件栈满了之后就会卡死for event in pygame.event.get():# 点击关闭if event.type == pygame.QUIT:exitFlag = True# 绘制图片到屏幕画布指定区域surface.blit(scaleImg,newRect)# 控制在窗口内来回移动if newRect.x > 800 - newRect.w:step = -10elif newRect.x < 0:step = 10# 更新绘制到屏幕上pygame.display.update([rect,newRect])rect = newRectif __name__ == '__main__':pass

3、代码分析

1)pygame窗口保持一直显示的前提是: python进程持续地在运行,要实现这个目的,需要有一个循环体在不停地运行,所以需要一个全局变量标识是否退出循环,结束进程,比如:上面声明exitFlag这个变量来记录当前是否退出循环,当exitFlag=True就退出游戏

2)游戏界面变化的频率,对应的是画面刷新的帧率,即画面每秒刷新多少次,这个刷新帧率设置太快,假如设备的GPU刷新跟不上也是没效果的,所以一般设置1秒刷新30次就可以达到看视频那样流畅的效果了,比如:上面代码设置FPS = 10是为了不让刷新太快,否则动画移动太快,看不清图片,其中,pygame时钟是控制游戏画面刷新的帧率,通过clock = pygame.time.Clock()获取到时钟对象,然后在循环体中设置指定的帧率即可: clock.tick(FPS)

3)pygame初始化是调用pygame.init(),这句代码需要在所有设置pygame属性之前调用,先初始化再做其他操作

4)os.environ['SDL_VIDEO_WINDOW_POS'] = "%d,%d" % (0, 25) , 指定pygame窗口的左上角显示在坐标(0,25)上,即距离屏幕左边0像素,距离屏幕上边25像素;不设置的话,窗口默认显示屏幕正中央

5)surface = pygame.display.set_mode((800, 500)),设置游戏窗口大小为:宽800像素,高500像素;

  • 当然,你还可以设置surface = pygame.display.set_mode((0, 0)),这样就是全屏显示,
    不过单纯这样设置全屏的话,你会发现窗口的大小是固定的,没法缩小
  • 那么要达到默认显示全屏,但是又可以随意调节的目的,可以这样设置:surface = pygame.display.set_mode((0, 0),pygame.RESIZABLE)
  • 上面两种方式显示的全屏都有一个问题,那就是还看到游戏窗口的标题栏与桌面的任务栏,不算是严格意义的全屏,要想游戏画面铺满整个屏幕,需要这样设置:surface = pygame.display.set_mode((0, 0),pygame.FULLSCREEN)

6)pygame.display.set_caption("pygame教程"),设置游戏窗口标题栏显示的标题名称或者说软件名也可以
在这里插入图片描述在这里插入图片描述

7) pygame.image.load('E:\AS-workspace\pygameTest\drawable\icon.png').convert_alpha(),复制本地图片的像素数据到一个Surface对象中储存,为后续绘制到屏幕做准备

  • 因为是png图片,需要额外处理alpha通道,所以需要使用 convert_alpha()转换成与我们的屏幕显示器相同的像素格式,这样能获得最快渲染速度;
  • 如果是jpg格式图片,没有alpha通道,也就是没有透明背景的图片,可以直接用convert()转换为pygame最快的渲染格式即可
  • 注意: 最好每张图片都调用一下covert方法,这样可以提高渲染速度,否则,pygame每次绘制时候也会自动根据屏幕显示器的像素格式进行转换,会降低渲染速度,可能会出现卡顿现象

8)pygame.display.set_icon(icon),设置指定图片的surface对象作为该程序的图标

9) scaleImg = pygame.transform.scale(icon, (400, 400)) ,缩小/放大图片到指定宽高,并返回缩小/放大之后的图片surface对象

10)rect = scaleImg.get_rect(),获取图片的矩形区域,即(left, top, width, height),也就是返回图片左上角的坐标,宽,高,不过默认返回的左上角坐标都是(0,0)

11)surface.blit(bgSurface,(0,0)),将图片绘制到指定的surface对象中,左上角的坐标为(0,0),注意:这里仅仅只是将图片绘制到surface上而已,并没有渲染到屏幕上,也就是说只做了这一步,屏幕上是看不到新绘制的内容的,还需要调用 pygame.display.update() 或者pygame.display.flip()才会把新绘制的内容更新渲染到屏幕上

12) rect = rect.move(step, 0),将rect沿着x轴移动step像素,沿着y轴移动0像素,即step为整数时,向右移动step像素,step为负数时,向左移动step像素

13) PyGames通过事件队列来处理其所有事件消息传递,但是事件队列是有上限的,标准的SDL 1.2声明的队列长度是128,如果事件队列的事件超出了限制,那么后续的事件都会被丢弃,你的程序就会显示无法响应卡死,所以一定要在每一帧中都用以下其中一个方法来处理事件: pygame.event.get(), pygame.event.pump(), pygame.event.wait(), pygame.event.peek() 或者 pygame.event.clear()

 for event in pygame.event.get():# 点击关闭if event.type == pygame.QUIT:exitFlag = True

14)由于pygame是一帧一帧绘制的,那么图片在移动时候,假如没有对上一帧绘制的图片做擦除,就会出现一堆图片重叠的现象,这就是所谓的“脏图片“,所以上面代码可以看到在每一帧刷新中,都对背景的指定区域rect做了擦除动作:surface.blit(bgSurface, rect,rect),即重新绘制一遍背景图的指定区域,以达到覆盖脏图片的效果,当然,你也可以把整个背景图重新绘制一遍的,但是这样太耗费性能

15)同时,我们更新绘制内容到屏幕显示器时,也不要一股脑地调用 pygame.display.update()更新整个屏幕,因为据测算,在性能比较一般的机器,每次调用update更新整个屏幕的耗时接近35ms, 那么1秒内最大只能刷新:1000/35 = 28帧,但是这里还没有计算游戏逻辑、绘制、获取输入输出等操作所耗费时间,仅仅是update,就最多只能一秒刷新28帧,那么这样算下来,就很容易出现卡顿现象了,那么有什么解决办法吗?看看上面代码,我们是对图片有改变的区域进行刷新即可,这样可以获得最高的刷新速率:pygame.display.update([rect,newRect]),换句话说,我们可以用list集合记录每一帧图片变化的区域,然后只对这些区域进行刷新即可


http://chatgpt.dhexx.cn/article/s9XCPVjv.shtml

相关文章

pygame教程3

目录 做个小游戏精灵类精灵类介绍使用精灵类 做个小游戏 这个小游戏使用了pygame教程2的知识。 #↓初始化 import pygame,sys from pygame.locals import * pygame.init()#初始化pygame。 screen pygame.display.set_mode((800,600)) pygame.display.set_caption("Hell…

pygame教程2

目录 响应键盘上的事件让画面动起来了解x轴和y轴画圆形圆形动起来 响应键盘上的事件 import pygame#导入pygame。 import sys#导入sys from pygame.locals import *#导入pygame所有的常量&#xff0c;方便以后使用。 pygame.init()#初始化pygame。 screen pygame.display.set…

pygame教程笔记

pygame教程 安装pygameGame Development 1-1: Getting Started with PygameGame Development 1-2: Working with SpritesGame Development 1-3: More About SpritesPygame Shmup Part 1: Player Sprite and ControlsPygame Shmup Part 2: Enemy SpritesPygame Shmup Part 3: Co…

pygame基础教程

pygame简介 pygame可以实现python游戏的一个基础包。 pygame实现窗口 初始化pygame&#xff0c;init()类似于java类的初始化方法&#xff0c;用于pygame初始化。 pygame.init() 设置屏幕&#xff0c;(500,400)设置屏幕初始大小为500 * 400的大小&#xff0c; 0和32 是比较高…

Python pygame(GUI编程)模块最完整教程(1)

提示&#xff1a;下滑文章左侧可以查看目录&#xff01;本教程分为多篇&#xff0c;总目录如下。 总目录&#xff1a; README.md Python-ZZY/Python-Pygame最完整教程 - Gitee.com 1 初识pygame 1.1 简介 pygame是python中一个流行的GUI编程模块&#xff0c;是专门为了开发游…

Pygame教程(非常详细)

文章目录 教程特点阅读条件 Pygame是什么扩展知识 Pygame下载和安装1) pip包管理器安装2) 二进制安装包安装 第一个Pygame程序初始化程序创建Surface对象事件监听游戏循环 Pygame Display显示模块详解Pygame Surface创建图像Pygame Transform图像变形Pygame Time时间控制详解1)…

GeoWave0.9.8开发人员指南

GeoWave0.9.8开发人员指南 官方英文地址&#xff1a;http://s3.amazonaws.com/geowave/0.9.8/docs/devguide.html 介绍 什么是GeoWave GeoWave是一个开源库&#xff0c;用于在排序的键值数据存储和流行的大数据框架之上存储&#xff0c;索引和搜索多维数据。GeoWave包含特定的…

行人检测之DPM

基于可识别训练的部件模型的目标检测 Object Detection with Discriminatively Trained Part Based Models 摘要 基于多尺度可变形的部件模型我们来描述一个目标检测系统。我们的系统能够表示高度可变的对象类并在PASCAL目标检测挑战达到最先进的结果。虽然可变形部件模型变…

Xuxiang Qi--Deep Learning based Semantic Labelling of 3D Point Cloud in Visual SLAM

元学习论文总结||小样本学习论文总结 2017-2019年计算机视觉顶会文章收录 AAAI2017-2019 CVPR2017-2019 ECCV2018 ICCV2017-2019 ICLR2017-2019 NIPS2017-2019 提出了一种建立三维密集语义地图的方法&#xff0c;采用GPU&#xff0c;ROS消息通信无法支持。 摘要 三维(3D)点云…

古老的DPM

基于可识别训练的部件模型的目标检测 Object Detection with Discriminatively Trained Part Based Models 摘要 基于多尺度可变形的部件模型我们来描述一个目标检测系统。我们的系统能够表示高度可变的对象类并在PASCAL目标检测挑战达到最先进的结果。虽然可变形部件模型变得…

OpenCV-Python (官方)中文教程(部分一)

官网链接(英文版):https://docs.opencv.org/4.1.1/d6/d00/tutorial_py_root.html 第一章. OpenCV简介 了解如何在计算机上设置OpenCV-Python&#xff01; 1.OpenCV-Python教程简介 1.1 OpenCV OpenCV是由Gary Bradsky于1999年在Intel公司创建的&#xff0c;第一次发布是在…

【视觉SLAM十四讲】视觉里程计—特征点法

本文为视觉 SLAM 学习笔记&#xff0c;讲解视觉里程计中的特征点法。 本讲内容概要 图像特征的意义&#xff0c;在单幅及多幅图像中提取特征点。对极几何的原理&#xff0c;利用对极几何的约束恢复图像间相机的三维运动PnP 问题&#xff0c;利用已知三维结构与图像的对应关系…

【记录】一个深度学习算法工程师的成长之路( 思考和方法以及计划 )

原文链接:https://blog.csdn.net/TeFuirnever/article/details/100999282 声明&#xff1a; 1&#xff09;该文章整理自网上的大牛和机器学习专家无私奉献的资料&#xff0c;具体引用的资料请看参考文献。 2&#xff09;本文仅供学术交流&#xff0c;非商用。所以每一部分具体的…

面向动态环境基于面元的RGB-D SLAM系统

点击上方“3D视觉工坊”&#xff0c;选择“星标” 干货第一时间送达 作者&#xff1a;robot L https://zhuanlan.zhihu.com/p/142175916 本文仅做学术分享&#xff0c;如有侵权&#xff0c;请联系删除。 主要内容 面向动态环境基于面元的RGB-D SLAM系统&#xff0c;主要内容如下…

StaticFusion

主要内容 面向动态环境基于面元的RGB-D SLAM系统&#xff0c;主要内容如下&#xff1a; 同时估计RGB-D相机位姿并分割当前帧图片中的静态像素。将当前帧像素的静态概率当做一个取值范围为 的连续变量&#xff0c;和位姿一起联合优化。构建静态场景的面元地图。为此&#xff…

Caffe各层参数详解

在之前的文章中&#xff0c;整理了 ubuntu18安装和caffe-cpu安装问题汇总&#xff08;含详细流程&#xff09;&#xff0c;这篇文章则对caffe的各个层进行一个剖析。文章篇幅较长&#xff0c;可根据目录按层选择阅读。 简述 Net是由Layer层层组成的 Net是由Solver文件支配的…

CoppeliaSim用户手册中文翻译版(二)

CoppeliaSim 用户手册 文章目录 5. 计算模块5.1 计算模块属性对话框5.2 碰撞检测5.3 距离计算5.4 逆运动学5.4.1 IK组和IK元素的基础知识5.4.2 解决IK和FK的任何类型的机制 5.5 逆运动对话框5.5.1 IK元素对话框 5.6 动力学5.6.1 设计动态仿真5.6.2 一般动力学特性5.6.2.1 动态引…

【记录】一个深度学习算法工程师的成长之路(思考和方法以及计划)

声明&#xff1a; 1&#xff09;该文章整理自网上的大牛和机器学习专家无私奉献的资料&#xff0c;具体引用的资料请看参考文献。 2&#xff09;本文仅供学术交流&#xff0c;非商用。所以每一部分具体的参考资料并没有详细对应。如果某部分不小心侵犯了大家的利益&#xff0c…

五年无人驾驶工作总结及展望

点击上方“小白学视觉”&#xff0c;选择加"星标"或“置顶” 重磅干货&#xff0c;第一时间送达本文转自|计算机视觉工坊现在是晚上22点46分&#xff0c;大小美女都睡觉了&#xff0c;我突然想写一篇这五年无人驾驶工作的总结。没有打草稿&#xff0c;想到啥说啥。如…

CoppeliaSim用户手册中文翻译版(一)

CoppeliaSim 用户手册 文章目录 主要功能历史版本许可证致谢和鸣谢概述1. 用户界面1.1 页面和视图1.2 自定义用户界面1.3 位置/方向操作1.3.1 位置对话框1.3.2 方向对话框1.3.3 使用鼠标移动物体 1.4 欧拉角1.5 用户设置1.6 快捷键1.7 命令行 2. 场景和模型2.1 场景2.2 模型2.2…