当前位置: 首页 > 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.xdnf.cn/news/1307197.html

相关文章:

  • 电工的基础知识以及仪器的使用
  • 浏览器面试题及详细答案 88道(45-55)
  • 吉他和弦学习:从音程基石到流畅弹奏
  • 机器学习——PCA(主成分分析)降维
  • MySQL快速恢复数据的N种方案完全教程
  • JavaWeb开发_Day12
  • 云原生俱乐部-杂谈2
  • UI-TARS-Desktop 深度解析:下一代智能自动化桌面平台
  • 数据处理与统计分析 —— numpy入门
  • 《Attention-driven GUI Grounding》论文精读笔记
  • 【Spring Cloud 微服务】1.Hystrix断路器
  • 【LeetCode 热题 100】55. 跳跃游戏
  • @mcp.tool如何从函数定义映射到llm系统输入
  • 如何回答研究过MQ的源码吗
  • 【121页PPT】智慧方案智慧综合体智能化设计方案(附下载方式)
  • [优选算法专题二滑动窗口——长度最小的子数组]
  • Effective C++ 条款42:了解 typename 的双重含义
  • AutoSar AP平台中EM,CM,SM,PHM,LT等AP基础软件都有宿主进程吗
  • Lecture 10: Concurrency 3
  • linux-数据链路层
  • C语言笔记6:C高级 part1
  • 【160页PPT】机械行业数字化生产供应链产品解决方案(附下载方式)
  • 深入理解Transformer:从训练机制到长文本处理的核心问题
  • GoLand深度解析:智能开发利器与cpolar内网穿透的协同革命
  • Linux系统编程—Linux基础指令
  • Point-LIO技术文档中文翻译解析
  • Python爬取推特(X)的各种数据
  • 活侠传 送修改器 免安装中文版
  • 深入理解 Python 闭包:从原理到实践
  • UE UDP通信