view_surface_id

使用此变量,您可以设置给定视口的内容以绘制到表面,或者获取对当前表面的引用 (如果已将其分配给视口)。使用表面时,通常需要将屏幕的 整个 可见区域捕获到表面,因此您可以使用此变量将其分配给视口。这意味着所选视图中显示的所有内容现在都将绘制到指定的表面上。现在,视图将 不会 绘制到屏幕上,这意味着您需要:

您还可以读取此变量来获取已分配给所选视图的表面,如果没有分配表面,则返回 -1,通常用于此功能的表面应该是视图相机本身的大小 (而不是视口)。下面的扩展示例展示了捕获视图并在 Draw GUI 事件中绘制视图的基本设置,有关表面的更多信息,请参阅 表面 部分。

请注意,还可以使用函数 view_set_surface_id() 将视口设置为表面。

重要 在为具有指定表面的视图绘制表面或纹理时必须小心,因为如果您尝试在同一视图内绘制视图的指定表面(或其纹理),则会遇到一个错误,因为您正在尝试将纹理绘制到自身上。

注意 此变量不保存真正的 GML 数组,因此您无法对其运行任何 数组函数 或对其进行序列化 (将其转换为字符串)。您可以对其运行的唯一操作是使用 view_surface_id[index] 语法访问索引处的值。

 

语法:

view_surface_id[0...7]

 

返回:

Surface or -1 (if no surface has been assigned)

 

扩展示例:

在此扩展示例中,我们将创建一个表面并将其指定给 viewport[0],以便它捕获指定给该端口的相机视图,然后将其绘制到 绘制GUI 事件中的屏幕。首先,我们需要在控制器实例的创建事件中初始化表面变量:

surf = -1;

我们将表面变量设置为-1,因为所有表面函数都应该真正用于绘制事件,以防止出现奇怪错误或未定义的行为。因此,完成此操作后,我们将在主绘制事件中执行以下操作:

if !surface_exists(surf)
{
    surf = surface_create(camera_get_view_width(view_camera[0]), camera_get_view_height(view_camera[0]));
    view_surface_id[0] = surf;
}

表面是易失性,这意味着由于系统内存管理和其他原因,它们可以随时从内存中删除,因此我们在这里检查表面是否存在,如果表面不存在,我们将创建表面并将其分配给视图0。完成此操作后,视图0中出现的所有内容现在都将被绘制到我们创建的表面。如果此时不执行任何其他操作,则在运行游戏时,您只会看到一个空白屏幕,因为所有绘制都是在表面上完成的,但表面本身不会在任何地方绘制。因此,我们现在需要在绘制GUI事件中将表面绘制到屏幕,如下所示:

if surface_exists(surf)
{
    draw_surface_stretched(surf, 0, 0, display_get_gui_width(), display_get_gui_height());
}

此代码现在将绘制我们从拉伸的视图的相机创建的表面,以填充整个 GUI 层。