持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第17天, 点击查看活动详情
pygame 调整显示模式
我故意在 Hello World 示例中忽略了打开显示器,因为我们只需要一个简单的显示器,但 Pygame 有多种选择。您创建的显示类型取决于游戏。通常更容易使用固定分辨率(显示大小),因为它可以简化代码。你的决定还取决于你在游戏中有多少动作——你一次在屏幕上移动的东西越多,游戏的运行速度就越慢。您可能必须通过选择较低的分辨率来补偿(这将再次加快速度)。
最好的解决方案通常是让玩家决定他们想要以什么分辨率运行,以便他们可以调整显示,直到他们在视觉质量和游戏运行流畅度之间取得良好的关系。如果你走这条路,你将不得不确保你的游戏在所有潜在的分辨率下看起来都很好!
在编写游戏之前,请不要担心这一点。只需在尝试Pygame脚本时选择适合您的分辨率,但请随时进行一些实验。
在“你好世界”中,我们使用以下行创建了一个 Pygame 窗口:
第一个参数是我们要创建的窗口的大小。大小 (640,480)
创建一个小窗口,可以舒适地安装在大多数桌面上,但如果您愿意,可以选择不同的大小。在窗口中运行非常适合调试,但大多数游戏都会用动作填充整个屏幕,并且没有通常的边框和标题栏。全屏模式通常更快,因为您的Pygame脚本不必与桌面上的其他窗口合作。要设置全屏模式,请将 FULLSCREEN 标志用于set_mode的第二个参数:
有时很难回到桌面。因此,最好先在窗口模式下对其进行测试。您还应该提供退出脚本的替代方法,因为关闭按钮在全屏模式下不可见。
当您全屏时,您的视频卡可能会切换到其他视频模式,这将更改显示器的宽度和高度,以及它可能一次可以显示多少种颜色。视频卡仅支持大小和颜色数量的几种组合,但是如果您尝试选择卡不直接支持的视频模式,Pygame将为您提供帮助。如果您要求的显示器尺寸不受支持,Pygame将向上选择下一个尺寸并将显示器复制到其中心,这可能会导致显示器顶部和底部出现黑色边框。要避免这些边框,请选择几乎所有视频卡都支持的标准分辨率之一:(640、480)、(800、600) 或 (1024、768)。要准确查看显示器支持的分辨率,您可以使用
pygame.display.list_modes (),返回包含受支持分辨率的元组列表。让我们从交互式解释器中尝试一下:
注意 注意 注意 pygame.init () 如何返回 (6,0) 的元组。pygame.init() 返回一个元组,其中包含成功初始化次数,后跟失败初始化次数。
如果视频卡无法为您提供所需的颜色数量,Pygame 将自动转换显示图面中的颜色以适合(这可能会导致图像质量略有下降)。
清单 3-4 是一个简短的脚本,演示了从窗口模式到全屏模式的运行。如果按 F 键,显示屏将填满整个屏幕(发生这种情况时可能会有几秒钟的延迟)。再次按 F 键,显示屏将显示返回到窗口。
有时,您可能希望用户能够调整Pygame窗口的大小,这通常是通过单击窗口的一角并用鼠标拖动来执行的。通过在调用set_mode时使用可调整大小的标志来执行此操作非常简单。如果用户更改了窗口大小,Pygame 会通过发送包含窗口新宽度和高度的 VIDEORESIZE 事件来通知您的代码。当您获得这些事件之一时,应再次调用pygame.display.set_mode以将显示设置为新尺寸。清单 3-5 演示了如何响应视频大小事件。清单 3-5.使用可调整大小的窗口
运行此脚本时,它将显示一个简单的 Pygame 窗口,其中包含背景图像。如果单击窗口的角落或边缘并用鼠标拖动,脚本将获得VIDORRESIZE事件。在该消息的处理程序中,是对set_mode的另一个调用,这将创建与新维度匹配的新屏幕图面。调整大小消息包含以下值:
·大小-这是一个包含窗口新维度的元组;大小[0]是宽度,大小[1]是高度。
w-此值包含窗口的新宽度。它与大小 [0] 的值相同,但可能更方便。
h-此值包含窗口的新高度。它与大小 [1] 的值相同,但可能更方便。
由于显示大小可能随此脚本而变化,因此我们通过根据需要多次对背景图像进行闪烁以覆盖显示器来绘制背景略有不同。对范围的两次调用将生成放置这些多个背景图像所需的坐标。
大多数游戏都以全屏模式运行,因此可调整大小的显示器可能不是您经常使用的功能。但是,如果您需要,它就在您的工具箱中!
无边框的窗户
通常,当您创建Pygame窗口时,您将需要一个带有标题栏和边框的标准窗口。但是,可以创建一个不具有这些功能的窗口,以便用户无法移动窗口或调整窗口大小,也无法通过关闭按钮关闭窗口。这种用途的一个实例是用于初始屏幕的窗口。某些游戏可能需要一段时间才能加载,因为它们包含许多图像和声音文件。如果发生这种情况时屏幕上没有任何可见内容,则玩家可能会觉得游戏无法正常工作并尝试再次启动它。要设置没有边框的显示,请在调用set_mode时使用 NOFRAME 标志。例如,以下行将创建一个“裸”窗口:
其他显示标志
在调用set_mode时,还可以使用其他一些标志。我认为它们是高级的,因为如果使用不当,它们可能会降低性能,或者在某些平台上导致兼容性问题。通常最好将值 0 用于窗口显示和
全屏显示全屏,确保您的游戏在所有游戏上都能正常工作
平台。也就是说,如果您知道自己在做什么,则可以设置一些高级标志以获得额外的性能。实验也没有坏处(它不会伤害您的计算机)。如果设置了 HWSURFACE 标志,它将创建所谓的硬件表面。这是一种特殊的显示表面,存储在图形卡的内存中。它只能与全屏标志结合使用,如下所示:
硬件图面可能比在系统(常规)内存中创建的图面更快,因为它们可以利用图形卡的更多功能来加快步进速度。硬件表面的缺点是它们不是在所有平台上都得到很好的支持。它们倾向于在Windows平台上工作,但在其他平台上却不那么好。
硬件表面也受益于双倍防标。这有效地创建了两个硬件表面,但任何时候都只有一个可见。以下行创建双缓冲硬件图面:
通常当你打电话给皮游戏时。显示。更新()整个屏幕从内存复制到显示器 - 这需要一点时间。双缓冲表面允许您立即切换到新屏幕,从而使您的游戏运行得更快一些。您可以使用的最后一个显示标志是 OPENGL。OpenGL 是一个图形库,它使用几乎每个图形卡上的3D图形加速器。使用此标志的缺点是您将无法再使用Pygame的2D图形功能。我们将在第9章中介绍使用OpenGL创建3D。
注意:如果您使用双缓冲显示器,则应调用
pygame.display.flip() 而不是 pygame.display.update ().这将执行即时显示切换,而不是复制屏幕数据。