当前位置: 首页 > news >正文

初步学习pygame,使用pygame搭建简单的窗口效果

在VSCode上使用pygame

第一步:创建 Python 虚拟环境

  1. 打开 VSCode 中的 Terminal(在菜单栏中选择 View > Terminal)
  2. 使用 cd 命令切换到你的项目文件夹
  3. 输入以下命令来创建一个新的虚拟环境:
   python3 -m venv env

这将在你的项目目录中创建一个名为 env 的文件夹,其中包含了你的 Python 环境。

第二步:激活虚拟环境

在 VS Code 的 Terminal 中,根据你的操作系统,运行适合的激活命令:

    .\env\Scripts\activate

你会注意到终端提示符改变,显示你已在 ‘env’ 环境中。

第三步:安装 pygame

在你的虚拟环境中,通过 Terminal 输入以下命令来安装 pygame:

python3 -m pip install pygame

到这里我们搭建好vscode上使用pygame库的基本条件,开始我们的pygame之路!

创建窗口

现在创建python文件,开始我们的代码。

# 导入 pygame 库
import pygame# 初始化所有 pygame 模块,此步在使用任何其他 pygame 函数之前都是必需的
pygame.init()# 创建一个 500x500 pix 的游戏窗口。参数是一个二元元组,表示窗口的宽度和高度
screen =  pygame.display.set_mode([500,500])# 这是一个用来控制主程序循环运行的开关变量
running = True
while running:  # 主程序循环# 内部事件循环,处理程序中发生的所有事件,比如鼠标点击。# get() 方法将获取 pygame 事件队列中的所有事件for event in pygame.event.get():# pygame.QUIT 是一个 pygame 特定的事件,由窗口 '关闭' 按钮点击触发if event.type == pygame.QUIT:running = False  # 用户点击 '关闭',开关变量 running 设置为 False 退出主程序循环# fill 方法会对整个屏幕进行清洗(或填充颜色)。三个参数分别对应 RGB 三种颜色,范围都是 0-255# 255 255 255 是白色screen.fill((255,255,255))# 画一个蓝色的圆。第二个参数是圆心的位置坐标,第三个参数是圆的半径# 圆的RGB颜色是 (0,0,255),即蓝色pygame.draw.circle(screen, (0,0,255), (250,250), 75)# flip() 是一个很重要的函数。它用来更新整个窗口的显示。# pygame 在操作窗口时常常需要采取先在“后台”完成所有绘制,再一次性刷新到屏幕上的方式。# flip 函数会将所有后台的绘制结果更新到屏幕上,使我们可以看到结果pygame.display.flip()# 离开主程序循环后,退出 pygame,清理内存
pygame.quit()

运行这个代码,我们可以得到一个白色的窗口,并且中间有一个蓝色的圆,如图:
在这里插入图片描述

蓝色方块

下面我们将编写一个显示四个蓝色方块的屏幕程序,如图
在这里插入图片描述
代码:

# 导入 pygame 库和对应的常量
import pygame
from pygame.locals import *# 定义一个自定义的 Square 类,这个类继承自 pygame.sprite.Sprite
class Square(pygame.sprite.Sprite):def __init__(self):# 调用父类(pygame.sprite.Sprite)的构造函数super(Square, self).__init__()# 创建一个 25x25 像素的 surface 对象,surface 在 pygame 中代表一个影像对象self.surf = pygame.Surface((25,25))# 使用 fill 方法,可以只填充一种颜色。将 surface 对象填充为 RGB = (0,200,255) 的颜色self.surf.fill((0,200,255))# 获取当前 surface 对象的矩形界限(rect 对象)self.rect = self.surf.get_rect()# 初始化 pygame
pygame.init()# 创建一个 800x600 像素的游戏窗口
screen = pygame.display.set_mode((800,600))# 创建四个 Square 实例
square1 = Square()
square2 = Square()
square3 = Square()
square4 = Square()# 设置游戏循环开关
gameOn = True# 游戏主循环
while gameOn:# 事件循环,处理游戏过程中发生的所有事件for event in pygame.event.get():# 如果检测到键盘输入的事件类型if event.type == KEYDOWN:# 判断如果按下的键是退格键(Backspace 键)if event.key == K_BACKSPACE:# 则将游戏循环开关 gameOn 设置为 False,退出游戏主循环gameOn = False# 如果检测到的事件类型是窗口关闭事件elif event.type == QUIT:# 则将游戏循环开关 gameOn 设置为 False,退出游戏主循环gameOn = False# 使用 screen 对象的 blit 功能,将四个 Square 对象绘制到指定的坐标处screen.blit(square1.surf, (40,40))screen.blit(square2.surf, (40, 530))screen.blit(square3.surf, (730, 40))screen.blit(square4.surf, (730, 530))# 更新整个屏幕,实现动画效果pygame.display.flip()# 退出游戏
pygame.quit()

针对几个关键的差异进行解释。

  • 精灵(Sprites): 在第二段代码中,使用了 Pygame 的精灵(Sprite)计数概念。精灵在游戏开发中是一个非常常见的概念,通常用于表示在屏幕上可以看到并可以与之交互的对象,如玩家角色、敌人、子弹等。在代码中,我们创建了一个精灵类 Square,它用一个代表其视觉表现形式的 surface 和一个代表其在屏幕上位置的 rect 对象来定义。并在后面的代码中创建了四个 Square 精灵。
  • 自定义类: 在第二段代码中,创建了一个自定义的 Square 类,这是面向对象编程的一部分。用这种方式,我们可以将可重用的代码打包到一个对象中,这样可以很容易地创建多个类似的实体(在这种情况下是 Square )。
  • 用户交互: 虽然两段代码都有事件循环来处理用户输入,但在第二段代码中,增加了对键盘的事件处理,这允许用户通过按下 “Backspace” 键来退出游戏。
  • 屏幕绘制(Blitting): “blit” 是 “block image transfer” 的简称,指的是把图像从一处复制到另一处。在第二段代码中,使用 blit() 函数将每一个 Square 精灵的视觉表现形式绘制或复制到定义的坐标处。

总的来说,第一段代码更加基础,主要向你展示了如何设置 Pygame 环境、初始化游戏窗口和基本的绘图功能。第二段代码则展示了如何创建和使用自定义的精灵类,以及如何处理更复杂的用户输入和在屏幕上绘制对象。

相关文章:

  • ArrayList与LinkedList
  • 计算机网络 第三章 数据链路层 局域网的数据链路层
  • 图生视频 学习笔记
  • [CCF-CSP] 202303-4 星际网络II
  • 【代码随想录算法训练营第37期 第十五天 | LeetCode226.翻转二叉树、101.对称二叉树 2】
  • Java并发面试题,多线程通关秘籍
  • 安卓绕过限制直接使用Android/data无需授权,支持安卓14(部分)
  • docker 使用桥接网
  • 我用Mybatis的方式封装了OLAP查询!
  • Linux:网页的各种状态码及其解释
  • 非阻塞sokcet和epoll
  • 【pdb的使用方法】
  • AI预测福彩3D采取888=3策略+杀断组+杀和尾缩水测试5月24日预测第1弹
  • LoadBalancer
  • DockerK8s
  • [分享]iOS开发 - 实现UITableView Plain SectionView和table不停留一起滑动
  • 《用数据讲故事》作者Cole N. Knaflic:消除一切无效的图表
  • 【跃迁之路】【444天】程序员高效学习方法论探索系列(实验阶段201-2018.04.25)...
  • Docker入门(二) - Dockerfile
  • Hexo+码云+git快速搭建免费的静态Blog
  • input实现文字超出省略号功能
  • Laravel5.4 Queues队列学习
  • python 学习笔记 - Queue Pipes,进程间通讯
  • ⭐ Unity 开发bug —— 打包后shader失效或者bug (我这里用Shader做两张图片的合并发现了问题)
  • 读懂package.json -- 依赖管理
  • 关于使用markdown的方法(引自CSDN教程)
  • 理清楚Vue的结构
  • 微服务核心架构梳理
  • ​sqlite3 --- SQLite 数据库 DB-API 2.0 接口模块​
  • ​ssh-keyscan命令--Linux命令应用大词典729个命令解读
  • ​业务双活的数据切换思路设计(下)
  • ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTr
  • #HarmonyOS:Web组件的使用
  • (11)工业界推荐系统-小红书推荐场景及内部实践【粗排三塔模型】
  • (web自动化测试+python)1
  • (Windows环境)FFMPEG编译,包含编译x264以及x265
  • (阿里云在线播放)基于SpringBoot+Vue前后端分离的在线教育平台项目
  • (二)延时任务篇——通过redis的key监听,实现延迟任务实战
  • (二十六)Java 数据结构
  • (分布式缓存)Redis持久化
  • (附源码)计算机毕业设计SSM保险客户管理系统
  • (七)c52学习之旅-中断
  • (顺序)容器的好伴侣 --- 容器适配器
  • (原創) 博客園正式支援VHDL語法著色功能 (SOC) (VHDL)
  • (转)EOS中账户、钱包和密钥的关系
  • (转)EXC_BREAKPOINT僵尸错误
  • (转载)Linux 多线程条件变量同步
  • ***php进行支付宝开发中return_url和notify_url的区别分析
  • .equals()到底是什么意思?
  • .form文件_SSM框架文件上传篇
  • .net 7和core版 SignalR
  • .Net Memory Profiler的使用举例
  • .NET MVC第三章、三种传值方式
  • .NET 药厂业务系统 CPU爆高分析
  • .NET简谈设计模式之(单件模式)