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

科普:Pygame 中,`pg.Surface` v.s. `screen`

在 Pygame 中,pg.Surfacescreen 是两个紧密相关但概念不同的对象,核心区别在于:pg.Surface 是通用的“图像容器”(画布),而 screen 是特殊的 Surface,专门用于最终显示到屏幕上

1. pg.Surface:通用的“画布”或“图像容器”

pg.Surface 是 Pygame 中最基础的图像类,本质是一个像素数据的容器,可以理解为一块“内存中的画布”。它的核心作用是:

  • 绘制图形(矩形、圆形等)、文字或加载图片;
  • 存储图像数据(如精灵的 image 属性就是一个 Surface);
  • 实现“离屏渲染”(先在内存中绘制,再一次性显示到屏幕)。

特点

  • 可以创建多个 Surface 对象(如一个用于玩家图像,一个用于背景,一个用于临时特效);
  • 自身不会直接显示在屏幕上,其内容需要通过 blit() 方法“复制”到 screen 上才会被用户看到;
  • 支持所有绘图操作(fill() 填充颜色、draw 绘制图形、blit() 粘贴其他图像等)。

示例

import pygame as pg
pg.init()# 创建一个 200x200 的红色 Surface(内存中的画布)
my_surface = pg.Surface((200, 200))
my_surface.fill((255, 0, 0))  # 填充红色# 创建一个 30x30 的蓝色小 Surface
small_surface = pg.Surface((30, 30))
small_surface.fill((0, 0, 255))  # 填充蓝色# 将小 Surface 粘贴到 my_surface 上(坐标 (50,50))
my_surface.blit(small_surface, (50, 50))

2. screen:关联屏幕的“显示表面”

screen 是通过 pg.display.set_mode() 创建的特殊 Surface 对象,它是唯一直接与物理屏幕关联的表面。所有最终需要显示给用户的内容,必须绘制到 screen 上(或通过它间接显示)。

特点

  • 一个游戏通常只创建一个 screen(对应一个窗口或全屏显示);
  • 其尺寸由 pg.display.set_mode((width, height)) 决定,即窗口/屏幕的分辨率;
  • 调用 pg.display.flip()pg.display.update() 时,screen 上的内容会被刷新到物理屏幕上;
  • 本质上是 pg.Surface 的子类,因此支持所有 Surface 的方法(fill()blit() 等)。

示例

# 创建屏幕(800x600 分辨率),返回的 screen 是一个特殊的 Surface
screen = pg.display.set_mode((800, 600))# 可以像操作普通 Surface 一样操作 screen
screen.fill((0, 0, 0))  # 填充黑色背景# 将前面创建的 my_surface 粘贴到 screen 上(坐标 (100, 100))
screen.blit(my_surface, (100, 100))# 刷新屏幕,使 screen 上的内容显示出来
pg.display.flip()

核心区别

维度pg.Surface(普通表面)screen(显示表面)
本质内存中的通用画布,用于存储/绘制图像与物理屏幕关联的特殊 Surface,用于最终显示
数量可创建多个(按需创建)通常只创建一个(对应一个窗口/屏幕)
显示方式需通过 blit() 复制到 screen 才会显示调用 flip()/update() 后直接显示到物理屏幕
用途存储图像、离屏渲染、精灵图像等作为最终显示的“载体”,所有可见内容必须绘制到这里

关键关系

screen pg.Surface 的一种特殊实例(继承关系),因此它拥有 pg.Surface 的所有方法(fill()blit() 等)。两者的关系类似:pg.Surface 是“草稿纸”,screen 是“最终要展示给观众的画框”——草稿纸上的内容需要复制到画框里,才能被看到。

例如,游戏中精灵的 imageSurface(存储精灵外观),精灵组的 draw(screen) 方法本质是将所有精灵的 imageSurface)通过 blit() 复制到 screen 上,最后通过 flip() 刷新显示。

代码示例

我们可以用“画画”的场景类比:pg.Surface 就像“草稿纸”,screen 就像“画展的展示墙”。 可总结为如下三步曲:

  • 你会先在草稿纸上画好细节(Surface 上绘制内容),
  • 最后把草稿纸上的画贴到展示墙上(blitscreen),
  • 观众才能看到(flip() 刷新后显示)。
import pygame as pg
pg.init()# 1. 创建“展示墙”(screen,特殊的Surface,关联屏幕)
screen = pg.display.set_mode((400, 300))  # 窗口大小400x300
pg.display.set_caption("Surface vs screen 示例")# 2. 创建“草稿纸1”(普通Surface,内存中的画布)
# 画一个200x200的红色方块
red_surface = pg.Surface((200, 200))
red_surface.fill((255, 0, 0))  # 红色填充# 3. 创建“草稿纸2”(普通Surface)
# 画一个50x50的蓝色小圆
blue_surface = pg.Surface((50, 50), pg.SRCALPHA)  # 带透明通道
pg.draw.circle(blue_surface, (0, 0, 255), (25, 25), 25)  # 蓝色圆形# 4. 在“草稿纸1”上贴“草稿纸2”(红色方块上贴蓝色圆)
red_surface.blit(blue_surface, (80, 80))  # 坐标(80,80)# 5. 把“草稿纸1”贴到“展示墙”上(screen)
screen.blit(red_surface, (100, 50))  # 坐标(100,50)# 6. 刷新“展示墙”,让观众看到最终画面
pg.display.flip()# 保持窗口打开
running = True
while running:for event in pg.event.get():if event.type == pg.QUIT:running = False
pg.quit()

效果类比

  • red_surfaceblue_surface 是普通 Surface(草稿纸): 草稿纸是“透明的”,即草稿纸“贴到”另一草稿纸上时,仅考虑图片的叠放。
  • Surface(草稿纸)只在内存中处理,即使你在上面画了内容,不贴到 screen 上也看不到。
  • screen 是特殊 Surface(展示墙):需要显示的内容都要通过这里“贴”的方式, 贴到 screen 上。
  • 只有贴到 screen 上的内容,经过 pg.display.flip() 刷新后,才能显示在窗口中被你看到。
http://www.lryc.cn/news/621730.html

相关文章:

  • 力扣 hot100 Day74
  • wordpress忘记密码怎么办
  • 2025最新:如何禁止指定软件联网?
  • php危险函数,二.assert()[现版本已弃用]
  • 基于nodejs+express的网上零食销售系统/零食商城平台
  • 智和信通全栈式运维平台落地深圳某学院,赋能运维管理提质提效
  • Golang信号处理实战
  • Chrome插件开发实战:从架构到发布全流程
  • HarmonyOS 实战:用 List 与 AlphabetIndexer 打造高效城市选择功能
  • 固定资产管理系统 OCR 识别功能技术解析
  • 架构需求规格说明(ARD):项目成功的隐形引擎
  • Android RxJava 过滤与条件操作详解
  • 小兔鲜儿-小程序uni-app(二)
  • 阿里云杭州 AI 产品法务岗位信息分享(2025 年 8 月)
  • Baumer高防护相机如何通过YoloV8深度学习模型实现驾驶员疲劳的检测识别(C#代码UI界面版)
  • 分享一个基于Hadoop的二手房销售签约数据分析与可视化系统,基于Python可视化的二手房销售数据分析平台
  • 企业级Spring事务管理:从单体应用到微服务分布式事务完整方案
  • OpenCV Python——图像查找(特征匹配 + 单应性矩阵)
  • 【解决笔记】MyBatis-Plus 中无 selectList 方法
  • Linux815 shell:while
  • 鸿蒙任务调度机制深度解析:优先级、时间片、多核与分布式的流畅秘密
  • 我的学习认知、高效方法与知识积累笔记
  • Ubuntu20.04下Px4使用UORB发布消息
  • 风场可视化 - 双分量数据
  • python30-正则表达式
  • Kotlin作用域函数全解:run/with/apply/let/also与this/it的魔法对决
  • shell脚本实现sha256sum校验并拷贝校验通过的文件
  • 【Spring框架】SpringIOC
  • 代码随想录二刷之“字符串”~GO
  • 状态管理中应用进程和宿主进程的概念及相互关系