设置显示模式

作者

皮特·辛纳斯

联系方式

pete@shinners.org

引言

在中设置显示模式 梨果 在监视器上创建可见的图像表面。该界面可以覆盖整个屏幕,也可以在支持窗口管理器的平台上设置窗口。显示表面只不过是一个标准的 梨果 曲面对象。中需要一些特殊功能。 pygame.displaypygame module to control the display window and screen 模块,使监视器上的图像表面内容保持更新。

在中设置显示模式 梨果 与大多数图形库相比,这是一项更容易的任务。优点是如果您的显示模式不可用, 梨果 将模拟您要求的显示模式。 皮博格 将选择与您所请求的设置最匹配的显示分辨率和颜色深度,然后允许您以所请求的格式访问显示。实际上,由于 pygame.displaypygame module to control the display window and screen 模块是围绕SDL库的绑定,SDL实际上正在做所有这些工作。

以这种方式设置显示模式有其优点和缺点。这样做的好处是,如果您的游戏需要特定的显示模式,您的游戏将在不支持您的要求的平台上运行。当你开始做一些事情时,这也会让你的生活变得更容易,以后再回去,让模式选择更具体一点总是很容易的。缺点是,你所要求的并不总是你会得到的。当必须模拟显示模式时,还存在性能损失。本教程将帮助您了解查询平台显示能力的不同方法,以及为您的游戏设置显示模式。

设置基础知识

首先要了解的是如何实际设置当前的显示模式。显示模式可在以下任何时间设置 pygame.displaypygame module to control the display window and screen 模块已初始化。如果您以前设置过显示模式,则再次设置将更改当前模式。设置显示模式由函数处理 pygame.display.set_mode((width, height), flags, depth)Initialize a window or screen for display 。此函数中唯一必需的参数是包含新显示模式的宽度和高度的序列。深度标志是表面要求的每像素位数。如果给定深度为8, 梨果 将创建颜色映射的曲面。当被给予更高的位深度时, 梨果 将使用压缩颜色模式。有关深度和颜色模式的更多信息可以在显示器和表面模块的文档中找到。深度的默认值为0。当给定自变量0时, 梨果 将选择要使用的最佳位深度,通常与系统当前的位深度相同。FLAGS参数允许您控制显示模式的额外功能。同样,有关这方面的更多信息,请参阅 梨果 参考文档。

如何决定

那么,如何选择最适合您的图形资源和运行游戏的平台的显示模式呢?有几种方法可以收集有关显示设备的信息。所有这些方法都必须在初始化显示模块之后调用,但您可能希望在设置显示模式之前调用它们。第一, pygame.display.Info()Create a video display information object 将返回一个特殊的VidInfo对象类型,它可以告诉您有关图形驱动程序功能的许多信息。功能 pygame.display.list_modes(depth, flags)Get list of available fullscreen modes 可用于查找系统支持的图形模式。 pygame.display.mode_ok((width, height), flags, depth)Pick the best color depth for a display mode 所采取的论点与 set_mode() ,但返回与您请求的位深度最匹配的位深度。最后, pygame.display.get_driver()Get the name of the pygame display backend 将返回由选择的图形驱动程序的名称 梨果

只要记住黄金法则就行了。 皮博格 几乎可以在您要求的任何显示模式下使用。需要模拟一些显示模式,这会降低您的游戏速度,因为 梨果 将需要将您所做的每一次更新转换为“真实”显示模式。最好的办法就是总是让 梨果 选择最佳位深度,并在加载时将所有图形资源转换为该格式。你让 梨果 通过调用来选择其位深度 set_mode() 不带深度参数或深度为0,或者您可以调用 mode_ok() 以找到与您需要的位深度最匹配的位。

当您的显示模式是窗口模式时,您通常必须匹配与桌面相同的位深度。当你是全屏时,一些平台可以切换到最适合你需要的任何位深度。如果在设置显示模式之前获取VidInfo对象,则可以找到当前桌面的深度。

设置显示模式后,可以通过获取VidInfo对象或调用显示表面上的任何Surface.get*方法来查找有关其设置的信息。

功能

您可以使用这些例程来确定最合适的显示模式。您可以在显示模块文档中找到有关这些函数的更多信息。

pygame.display.mode_ok(size, flags, depth)Pick the best color depth for a display mode

该函数接受与pygame.display.set_mode()完全相同的参数。它返回您所描述的模式的最佳可用位深度。如果返回零,则在没有仿真的情况下,所需的显示模式不可用。

pygame.display.list_modes(depth, flags)Get list of available fullscreen modes

返回具有请求的深度和标志的受支持显示模式的列表。当没有模式时,返回一个空列表。FLAGS参数缺省为 FULLSCREEN .如果指定您自己的标志时不带 FULLSCREEN ,则可能会得到-1的返回值。这意味着任何显示大小都可以,因为显示将是窗口的。请注意,列出的模式按从大到小的顺序排序。

pygame.display.Info()Create a video display information object

此函数返回一个具有多个描述显示设备的成员的对象。打印VidInfo对象将快速显示该对象的所有成员和值。**

>>> import pygame.display
>>> pygame.display.init()
>>> info = pygame.display.Info()
>>> print(info)
<VideoInfo(hw = 0, wm = 1,video_mem = 0
        blit_hw = 0, blit_hw_CC = 0, blit_hw_A = 0,
        blit_sw = 0, blit_sw_CC = 0, blit_sw_A = 0,
        bitsize  = 32, bytesize = 4,
        masks =  (16711680, 65280, 255, 0),
        shifts = (16, 8, 0, 0),
        losses =  (0, 0, 0, 8),
        current_w = 1920, current_h = 1080
>

您可以简单地将所有这些标志作为VidInfo对象的成员进行测试。

示例

以下是初始化图形显示的不同方法的一些示例。它们应该可以帮助您了解如何设置您的显示模式。**

>>> #give me the best depth with a 640 x 480 windowed display
>>> pygame.display.set_mode((640, 480))

>>> #give me the biggest 16-bit display available
>>> modes = pygame.display.list_modes(16)
>>> if not modes:
...     print('16-bit not supported')
... else:
...     print('Found Resolution:', modes[0])
...     pygame.display.set_mode(modes[0], FULLSCREEN, 16)

>>> #need an 8-bit surface, nothing else will do
>>> if pygame.display.mode_ok((800, 600), 0, 8) != 8:
...     print('Can only work with an 8-bit display, sorry')
... else:
...     pygame.display.set_mode((800, 600), 0, 8)



Edit on GitHub