Pygame 基础教程02: 显示窗口(display) 与 图像(Surface)

这篇具有很好参考价值的文章主要介绍了Pygame 基础教程02: 显示窗口(display) 与 图像(Surface)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

原文链接:https://xiets.blog.csdn.net/article/details/131382728

版权声明:原创文章禁止转载

专栏目录:Pygame 专栏(总目录)

1. 显示窗口: display

pygame.display 模块提供了对 pygame 显示的控制。可以把 pygame.display 看做是包含了一个 系统窗口 的 显示器屏幕。

pygame.display 模块主要函数:

# 设置显示窗口的标题
pygame.display.set_caption(title, icontitle=None)

# 设置显示窗口的图标
pygame.display.set_icon(Surface)

# 初始化用于显示的窗口或屏幕, 该函数将创建一个用于映射到系统窗口显示的 Surface 图像。
#
# size      显示窗口的大小 (内容窗口, 不包括标题栏和边框)
#
# flags     控制显示类型, 可以用 位或|运算 组合多种类型, 
#           flags 可取值:
#               pygame.FULLSCREEN       创建全屏显示 create a fullscreen display
#               pygame.DOUBLEBUF        仅适用于OPENGL
#               pygame.HWSURFACE        在 pygame 2 已过时
#               pygame.OPENGL           创建 OpenGL 可渲染显示
#               pygame.RESIZABLE        显示窗口大小可变
#               pygame.NOFRAME          显示窗口将没有边框或控件
#               pygame.SCALED           分辨率取决于桌面大小和图形缩放
#               pygame.SHOWN            窗口以可见模式打开 (默认)
#               pygame.HIDDEN           窗口以隐藏模式打开
#
# display   窗口在哪个显示器上显示, 用于连接了多个显示器的情况, 如果 get_num_displays() == 2, 则 display=1 表示窗口显示在第2个显示器上
#
# depth     颜色深度, 通常最好不要传递 depth 参数, 它将默认为系统的最佳和最快颜色深度
#
# vsync     通过将 vsync 参数设置为 1, 可以获得具有垂直同步的显示器, 但不能保证获得
#
# 返回一个与窗口内容区域绑定的 Surface 图像对象, 之后在此图像上的绘制, 在调用 update() 或 flip() 函数后, 将同步显示在屏幕窗口上
#
pygame.display.set_mode(size=(0, 0), flags=0, depth=0, display=0, vsync=0) -> Surface

# 更新屏幕显示, 将 set_mode() 返回的 Surface图像 中的内容全部更新到显示屏幕上
pygame.display.flip()

# 更新屏幕显示, 只更新特定区域。如果没有传递任何参数, 则相当于 flip(), 即 update() 相当于 flip()。
pygame.display.update(rectangle=None)

pygame.display 模块其他函数:

pygame.display.init()                                   # 初始化显示模块, 当调用 pygame.init() 时会自动调用
pygame.display.quit()                                   # 关闭显示模块, 程序退出时自动处理
pygame.display.get_init() -> bool                       # 如果显示模块已初始化, 则返回 True
pygame.display.get_active() -> bool                     # 当前窗口的 Surface 在屏幕上处于活动状态时返回 True
pygame.display.get_caption() -> (title, icontitle)      # 获取显示窗口的标题
pygame.display.get_surface() -> Surface                 # 获取当前窗口的 Surface, 即 set_mode() 返回的对象
pygame.display.get_num_displays() -> int                # 返回显示器的数量
pygame.display.get_window_size() -> tuple               # 返回窗口或屏幕的大小, 即 set_mode() 返回的 Surface 大小, 如果使用了 pygame.SCALED, 可能和 set_mode() 返回的 Surface 大小不一样
pygame.display.get_wm_info() -> dict                    # 获取有关当前窗口系统的信息

pygame.display.get_desktop_sizes() -> list                                      # 获取激活状态的显示器分辨率大小
pygame.display.list_modes(depth=0, flags=pygame.FULLSCREEN, display=0) -> list  # 获取可用的全屏模式列表

pygame.display.toggle_fullscreen() -> int                           # 在 窗口模式 和 全屏模式之 间切换显示窗口

pygame.display.mode_ok(size, flags=0, depth=0, display=0) -> depth  # 为显示模式选择最佳颜色深度
pygame.display.iconify() -> bool                                    # 图标化显示Surface
pygame.display.set_gamma(red, green=None, blue=None) -> bool        # 更改硬件伽马斜坡
pygame.display.set_gamma_ramp(red, green, blue) -> bool             # 使用自定义查找更改硬件伽玛斜坡

pygame.display.set_palette(palette=None)            # 设置显示调色板

pygame.display.get_driver() -> str                  # 获取 pygame 显示后端的名称
pygame.display.Info() -> VideoInfo                  # 创建视频显示信息对象

pygame.display.get_allow_screensaver() -> bool      # 返回是否允许运行屏保
pygame.display.set_allow_screensaver(bool)          # 设置屏保是否可以运行

pygame.display.gl_get_attribute(flag) -> value      # 获取当前显示的 OpenGL 标志的值
pygame.display.gl_set_attribute(flag, value)        # 请求显示模式的 OpenGL 显示属性

2. 图像: Surface

pygame.surface 模块中主要有一个 Surface 类型,并且导出到了 pygame 模块中,可以直接使用 pygame.Surface

在 Pygame 中 Surface 用于表示具有固定的分辨率和像素格式的、内存中的一张图像。比如本地图片加载到内存中后就得到一个 Surface 对象。

调用 pygame.display.set_mode() 函数初始化显示窗口,返回的就是一个 Surface 对象,称为 “显示图像” (display Surface)。显示图像 是 Pygame 中单独的一个 Surface,它包含在系统窗口中,如果是全屏模式则全屏运行。显示图像(Surface) 与 屏幕中系统窗口的内容区域相对应,可以把游戏内容绘制到 显示图像 中,然后通过调用 pygame.display.update()pygame.display.flip() 函数把 显示图像 中的内容更新到 屏幕上。

系统窗口 与 显示图像 的关系:

pygame.surface,Python Pygame 游戏开发基础教程与项目实践,python,pygame,游戏引擎,游戏程序

屏幕中的一个系统窗口,包括 窗口图标、窗口标题、最小/最大化和关闭按钮、窗口边框、窗口内容(还可以有菜单栏、工具栏、状态栏等)。上图中的红色部分就是窗口的内容区域,也就是 pygame.display.set_mode() 函数返回的 显示图像(Surface) 对应的区域。除了 窗口内容 外,其他都是操作系统部分,不同操作系统、不同系统主题,显示的效果可能不一样。

除了 set_mode() 返回的 Surface,程序中可以调用它的构造方法,任意创建 Surface 对象。也可以把本地图片加载为 Surface,可以通过字体模块把任意文本渲染为 Surface。然后把自己创建的 Surface 通过 blit() 方法绘制到 set_mode() 返回的 显示图像(Surface) 中,再调用 update() 或 flip() 就能同步显示在屏幕上了。

Surface 图像坐标系的原点在左上角,X 轴方向水平向右,Y 轴方向竖直向下:

pygame.surface,Python Pygame 游戏开发基础教程与项目实践,python,pygame,游戏引擎,游戏程序

pygame.Surface 类的主要方法:

# Surface 的构造方法, 创建具有指定宽高的图像, 默认使用纯黑色填充
# flags 附加标志, 典型的标志是: pygame.RLEACCEL, pygame.SRCALPHA (像素点包含alpha通道), pygame.SRCCOLORKEY
# depth 像素的颜色深度, 默认 Pygame 会使用最适合当前系统的颜色深度。
pygame.Surface((width, height), flags=0, depth=0, masks=None) -> Surface
pygame.Surface((width, height), flags=0, Surface) -> Surface

# 获取 Surface 的宽高尺寸
pygame.Surface.get_size() -> (width, height)
pygame.Surface.get_width() -> int
pygame.Surface.get_height() -> int

# 将 一个图像(source) 绘制到 当前图像(self) 上, 绘制后超出当前图像部分将被忽略。
# dest 是一个坐标二元组, 表示绘制的位置 (绘制后 source 的左上角在 self 上的坐标位置)。
# dest 也可以是一个 四元祖(x, y, width, height) 或 Rect矩形区域, 如果是则只取 Rect.x 和 Rect.y 属性作为绘制坐标。
# 返回 绘制后 source 在 self 上的位置区域。
pygame.Surface.blit(source, dest, area=None, special_flags=0) -> Rect

# 将 多个图像 绘制到 当前图像 上
pygame.Surface.blits(blit_sequence=((source, dest), ...), doreturn=1) -> [Rect, ...]
pygame.Surface.blits(((source, dest, area), ...)) -> [Rect, ...]
pygame.Surface.blits(((source, dest, area, special_flags), ...)) -> [Rect, ...]

# 用纯色填充 Surface
pygame.Surface.fill(color, rect=None, special_flags=0) -> Rect

# 创建 Surface 的新副本
pygame.Surface.copy() -> Surface

# 更改图像的像素格式(增加 alpha 通道), 包括每个像素的 alpha, 创建新副本
pygame.Surface.convert_alpha(Surface) -> Surface
pygame.Surface.convert_alpha() -> Surface

# 设置 Surface 图像的整体 alpha 值。这里设置的 alpha 是与像素值无关的外置属性, 不针对某个像素点, 而是针对整体, 
# 最终显示为具体像素点的 alpha 值和整体 alpha 值的组合效果。就算没有通过 convert_alpha() 转换为带 alpha 通道的图像, 也可以设置整体 alpha 值。 
pygame.Surface.set_alpha(value, flags=0)
pygame.Surface.set_alpha(None)
# 获取当前 Surface 图像的整体 alpha 值
pygame.Surface.get_alpha() -> int

# 获取单个像素的颜色值, 像素值无论是否有 alpha 通道, 均返回 (R, G, B, A)。如果没有 alpha 通道, 则 A 固定为 255。
pygame.Surface.get_at((x, y)) -> Color
# 设置单个像素的颜色值, 可以以 "#RGBA" 或 (R, G, B, A) 的形式设置。如果参数格式中没有 A, 则 A 默认为 255。如果没有 alpha 通道, 则 A 将被忽略。
pygame.Surface.set_at((x, y), Color)

# 创建一个引用其父级的新 Surface (获取 Surface 的某个区域, 相当于图像裁剪)
# 返回的是原 Surface 的一个区域视图, 不是副本 (如果需要副本, 可以再调用 copy() 方法), 因此在原图像上的改变会反应在返回的视图上。
pygame.Surface.subsurface(Rect) -> Surface

pygame.Surface 类的其他方法:

pygame.Surface.convert(Surface=None) -> Surface         # 更改图像的像素格式, 创建新副本
pygame.Surface.convert(depth, flags=0) -> Surface
pygame.Surface.convert(masks, flags=0) -> Surface

pygame.Surface.lock()                                   # 锁定 Surface 内存以进行像素访问
pygame.Surface.unlock()                                 # 通过像素访问解锁 Surface 内存
pygame.Surface.mustlock() -> bool                       # 判断 Surface 是否需要锁定
pygame.Surface.get_locked() -> bool                     # 判断 Surface 当前是否锁定
pygame.Surface.get_locks() -> tuple                     # 获取 Surface 的锁

pygame.Surface.set_colorkey(Color, flags=0)             # 设置透明色键
pygame.Surface.get_colorkey() -> RGB | None             # 获取当前透明色键
pygame.Surface.get_at_mapped((x, y)) -> Color           # 获取单个像素的映射颜色值
pygame.Surface.get_palette() -> [RGB, RGB, RGB, ...]    # 获取 8 位 Surface 的颜色索引调色板
pygame.Surface.get_palette_at(index) -> RGB             # 获取调色板中单个条目的颜色
pygame.Surface.set_palette([RGB, RGB, RGB, ...])        # 为 8 位 Surface 设置调色板
pygame.Surface.set_palette_at(index, RGB)               # 在 8 位 Surface 调色板中设置单个索引的颜色
pygame.Surface.map_rgb(Color) -> mapped_int             # 将颜色转换为映射颜色值
pygame.Surface.unmap_rgb(mapped_int) -> Color           # 将映射的整数颜色值转换为 Color
pygame.Surface.set_clip(rect|None)                      # 设置 Surface 的当前裁剪区域
pygame.Surface.get_clip() -> Rect                       # 获取 Surface 当前的裁剪区域
pygame.Surface.scroll((dx=0, dy=0))                     # 将图像向右移动 dx 像素, 向下移动 dy 像素 (dx 和 dy 可以是负值)

pygame.Surface.get_parent() -> Surface                  # 找到子 Surface 的父级
pygame.Surface.get_abs_parent() -> Surface              # 找到子 Surface 的顶级父级
pygame.Surface.get_offset() -> (x, y)                   # 找到父子 Surface 下子 Surface 的位置
pygame.Surface.get_abs_offset() -> (x, y)               # 找到子 Surface 在其顶级父 Surface 内的绝对位置

pygame.Surface.get_rect() -> Rect                       # 获取 Surface 的矩形区域, 返回 Rect(0, 0, width, height)
pygame.Surface.get_bitsize() -> int                     # 获取 Surface 像素格式的位深度
pygame.Surface.get_bytesize() -> int                    # 获取 Surface 每个像素点使用的字节数, RGB 格式的图像为 3, RGBA 格式的图像为 4
pygame.Surface.get_flags() -> int                       # 获取用于 Surface 的附加标志
pygame.Surface.get_pitch() -> int                       # 获取每个 Surface 行使用的字节数, 等价于 width * get_bytesize()
pygame.Surface.get_masks() -> (R, G, B, A)              # 在颜色和映射整数之间转换所需的位掩码
pygame.Surface.set_masks((R, G, B, A))                  # 设置在颜色和映射整数之间转换所需的位掩码
pygame.Surface.get_shifts() -> (R, G, B, A)             # 在颜色和映射整数之间转换所需的位移位
pygame.Surface.set_shifts((R, G, B, A))                 # 设置在颜色和映射整数之间转换所需的位移位
pygame.Surface.get_losses() -> (R, G, B, A)             # 用于在颜色和映射整数之间转换的有效位
pygame.Surface.get_bounding_rect(min_alpha=1) -> Rect   # 找到包含数据的最小矩形
pygame.Surface.get_view(<kind>="2") -> BufferProxy      # 返回 Surface 像素的缓冲区视图
pygame.Surface.get_buffer() -> BufferProxy              # 为 Surface 的像素获取缓冲区对象
pygame.Surface._pixels_address: int                     # (属性) 像素缓冲区地址
pygame.Surface.premul_alpha() -> Surface                # 返回 Surface 的副本, 其中 RGB 通道预乘以 alpha 通道

3. display 与 Surface 代码示例

下面是两个用于演示的示例图片:

pygame.surface,Python Pygame 游戏开发基础教程与项目实践,python,pygame,游戏引擎,游戏程序pygame.surface,Python Pygame 游戏开发基础教程与项目实践,python,pygame,游戏引擎,游戏程序

把上面两个图片保存到本地,放在与 py 源码文件相同目录下,并命名为 duck.pngfloor.png

display 与 surface 代码示例:

import pygame


def main():
    # 初始化 pygame
    pygame.init()

    # 设置系统窗口标题
    pygame.display.set_caption("display 与 Surface")

    # 加载本地图片 (图片文件 与 当前py文件 在相同路径), 返回的是 Surface 对象
    duck_img = pygame.image.load("duck.png")
    print(type(duck_img), duck_img)
    # Output: <class 'pygame.surface.Surface'> <Surface(80x80x32 SW)>
    # 其中 80x80x32 表示 duck_img 的宽高为 80x80, 颜色模式为 32 位颜色

    # 设置系统窗口图标, 把一个 Surface 图像设置为系统窗口图标
    pygame.display.set_icon(duck_img)

    # 初始化显示窗口, 返回一个与窗口内容区域绑定的 Surface 对象 (显示图像)
    # 因为此 Surface 与屏幕窗口关联, 所以一般命名为 screen 或 display_surface
    screen = pygame.display.set_mode((400, 300))
    print(type(screen), screen)                 # Output: <class 'pygame.surface.Surface'> <Surface(400x300x32 SW)>

    # 加载本地图片
    floor_img = pygame.image.load("floor.png")

    # 裁剪图像, 创建 floor_img 左上角 100x100 的矩形视图区域, 返回的是 Surface 对象
    sub_img = floor_img.subsurface((0, 0, 100, 100))
    print(type(sub_img), sub_img)               # Output: <class 'pygame.surface.Surface'> <Surface(100x100x32 SW)>

    # 游戏主循环
    while True:
        # QUIT 退出事件判断
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                # 退出 pygame
                pygame.quit()
                return

        # 先填充背景颜色
        screen.fill("#CCCCCC")

        # 把 duck_img 绘制到 screen 图像中, 绘制后 duck_img 的左上角在 screen 的 (50, 50) 坐标位置
        screen.blit(duck_img, (50, 50))

        # 把 floor_img 绘制到 screen 图像的底部中间
        screen.blit(floor_img, (screen.get_width() / 2 - floor_img.get_width() / 2, screen.get_height() - floor_img.get_height()))

        # 把 sub_img 绘制到 screen 的 (230, 30) 位置
        screen.blit(sub_img, (230, 30))

        # 把 screen 图形中的内容更新到屏幕窗口
        pygame.display.flip()


if __name__ == "__main__":
    main()

pygame.image.load() 函数加载图片,传递的参数是图片文件的本地路径。在任意编程语言中,路径可以使用 相对路径绝对路径 表示,例如 duck.pngimage/duck.png 都是一个相对路径,D:\image\duck.png/image/duck.png 是一个绝对路径。相对路径相对于程序当前的工作目录,Python 中可以调用 os.getcwd() 获取当前工作路径。如果初学者搞不清楚相对路径或提示文件找不到,可以先直接使用绝对路径,例如:r"D:\image\duck.png""D:/image/duck.png"

在源码文件所在路径,运行代码:

pygame.surface,Python Pygame 游戏开发基础教程与项目实践,python,pygame,游戏引擎,游戏程序文章来源地址https://www.toymoban.com/news/detail-721516.html

到了这里,关于Pygame 基础教程02: 显示窗口(display) 与 图像(Surface)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • python报错:argument 1 must be pygame.surface.Surface, not builtin_function_or_method解决方法

    1、报错分析 : 根据报错信息,提示我们出错的原因在与第一个参数类型必须是pygame类型,但是我们的参数类型不匹配。 2、源码分析 这里的方法blit()中的第一个参数是STATICSURF,一个全局常量。根据报错我们知道是它出了问题。我们找到这个参数的赋值代码。 3、STATICSURF参数

    2024年02月12日
    浏览(43)
  • 【课程介绍】OpenCV 基础入门教程:图像读取、显示、保存,图像处理和增强(如滤波、边缘检测、图像变换),特征提取和匹配,目标检测和跟踪

    [ 专栏推荐 ] 😃 《视觉探索: OpenCV 基础入门教程》 😄 ❤️【简介】: Opencv 入门课程适合初学者,旨在介绍 Opencv 库的基础知识和核心功能。课程包括图像读取、显示、保存,图像处理和增强(如滤波、边缘检测、图像变换),特征提取和匹配,目标检测和跟踪等内容。学

    2024年02月16日
    浏览(45)
  • MATLAB不显示figure绘图窗口但保存图像的方案

    MATLAB不显示figure绘图窗口但保存图像的方案,代码如下: figure的参数选项及含义如下: Name : 设置 Figure 窗口的标题。 NumberTitle : 控制是否显示 Figure 窗口的序号和标题。 Color : 设置 Figure 窗口的背景颜色。 Position : 设置 Figure 窗口在屏幕上的位置和大小。 Visible : 控制 Figure 窗

    2024年02月11日
    浏览(29)
  • pygame入门教程-基础篇

    我们先启动一个窗口 我们通过 screen = pygame.display.set_mode((800,600)) 设置了一个窗口,并且返回了一个 screen 的变量,这个变量的类型是 pygame.Surface ,也就是一个画布。我们基于这个画布来作画,例如加载一个图片到这个画布上,或者绘制一个圆。 我们发现这个窗口一闪而过,

    2023年04月08日
    浏览(27)
  • 基于WPF Opencv实现一个图像可移动、缩放和可交互的显示窗口

    学习Halcon的HSmartWindowControl窗口控件,用WPF和Opencv仿照了一个。 显示控件的主体是两个Canvas: Root Canvas是背景,刷上了网格; 把要显示的图像作为Image Canvas的图像背景, 后面图像的移动,缩放,实质都是Image Canvas。 可交互,学习的是Halcon的绘图对象,WPF的Path来实现的,Path类

    2023年04月09日
    浏览(31)
  • 可视可交互!在全志H618上用OpenCV读取图像显示到PyQt5窗口上

    OpenCV能够处理图像、视频、深度图像等各种类型的视觉数据,在某些情况下,尽管OpenCV可以显示窗口,但PyQt5可能更适合用于创建复杂的交互式应用程序,而自带GPU的H618就成为了这些图像显示的最佳载体。 这里分享一个代码,功能是使用图像处理库opencv从摄像头获取数据,缩

    2024年02月01日
    浏览(35)
  • Python Pygame 游戏开发基础教程与项目实践(总目录)

    原文链接:https://xiets.blog.csdn.net/article/details/131368147 版权声明:原创文章禁止转载 Pygame 是一个免费的开源的跨平台库(支持 Windows、MacOS、Linux),用于使用 Python 开发视频游戏等多媒体应用程序。 Pygame 基础教程01: Python (Pygame) 游戏开发模块简介与安装 Pygame 基础教程02: 显示

    2024年02月14日
    浏览(38)
  • Android 显示框架:Surface详解之一

    Surface是一个显示系统中的组件,无论是在图形系统的结构之中,还是在生产消费模型的流程之中都做作为一个举足轻重的角色,参与整个安卓的显示生命周期之中。 我们摘抄了两段谷歌对surface的描述作为贯穿整个文章的中心: 1.A surface is an interface for a producer to exchange buff

    2024年02月07日
    浏览(27)
  • 【opencv】示例-demhist.cpp 调整图像的亮度和对比度,并在GUI窗口中实时显示调整后的图像以及其直方图。...

    这段代码是使用C++和OpenCV库编写的图像处理程序,其主要功能是 调整图像的亮度和对比度,并在GUI窗口中实时显示调整后的图像以及其直方图。 用户可以通过界面上的滑动条来动态地调整亮度和对比度参数从而观察到图像即时的变化效果。程序首先读取并显示一个灰度图像

    2024年04月10日
    浏览(35)
  • Pygame 基础教程12: 使用 精灵(Sprite) 实现 帧动画(Animation)

    原文链接:https://xiets.blog.csdn.net/article/details/131395288 版权声明:原创文章禁止转载 专栏目录:Pygame 专栏(总目录) 精灵(Sprite) 表示游戏画面中基本的显示元素,前面所介绍的精灵虽然位置可以动态移动,但都是一张静态图片。游戏中还有许多动态的动画精灵,如一只飞翔的

    2024年01月17日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包