0

我在游戏制作工作室 2 上编写了一个很酷的灯光效果,它起作用了,所以我决定让游戏全屏,但是,一旦我把游戏全屏,就会弹出一个错误说:

试图设置一个不存在的表面目标。

这是代码。

对象照明:

创建事件:

color = c_ltgray;    
globalvar light;    
light = surface_create(room_width,room_height);    
depth = -999;    

步骤事件:

surface_set_target(light);   
draw_set_color(color);
draw_rectangle(0,0,room_width,room_height,false);
surface_reset_target();

抽奖事件:

gpu_set_blendmode(bm_subtract);
draw_surface(
    light,
    camera_get_view_x(view_camera[0]),
    camera_get_view_y(view_camera[0])
);
gpu_set_blendmode(bm_normal);

对象播放器:

结束步骤事件:

size = 360;
gpu_set_blendmode(bm_subtract);
surface_set_target(light);
draw_ellipse_color(x-size/2-camera_get_view_x(view_camera[0]),y-size/2-
camera_get_view_y(view_camera[0]),x+size/2-camera_get_view_x(view_camera[0]),y+size/2-camera_get_view_y(view_camera[0]),c_white,c_black,false);
surface_reset_target();
gpu_set_blendmode(bm_normal);

obj_fullscreen:

创建事件:

window_set_fullscreen(true);
4

2 回答 2

0

您得到的错误是因为表面是易变的,如文档中所述:

首先,您应该意识到表面(应用程序表面除外)是“易变的”。这意味着如果设备或窗口失去焦点或被最小化(很好的例子是当 Windows 中出现屏幕保护程序时,或者在 Android 设备上应用程序由于调用而失去焦点时),那么表面可能会被破坏。这是因为它存储在纹理内存中,并且当目标平台需要该内存用于其他用途时可能会被覆盖,这意味着您应该始终拥有某种类型的故障安全代码,通常使用 surface_exists 函数。

文档:https ://docs2.yoyogames.com/source/_build/3_scripting/4_gml_reference/drawing/surfaces/index.html

因此,在每次尝试使用表面之前,您想要做的是检查它是否仍然存在,如果不存在,则创建它。

所以,把它放在你的绘图事件的第一行:

if (!surface_exists(light)) {
    light = surface_create(room_width,room_height);
}

如果它被破坏,这将重新创建表面。

您应该应用的第二个修复是,您的 step 事件中的代码正在将东西绘制到表面上 - 虽然它有效,但它会减慢您的游戏速度。最好将所有与绘图相关的步骤放在您的绘图事件中,因此将该步骤代码也移至绘图事件(在表面下存在检查!)

然后你有另一个问题:你的 obj_player 实例试图引用在对象“obj_lighting”中创建的表面。但是,该变量light在您的 中是未知的obj_player,因此您需要引用它:obj_lighting.light将这样做。再说一遍,确保你做表面检查,最好在你的抽奖活动中做这一切!

于 2019-06-05T11:55:24.027 回答
0

假设,create事件发生在其他事件之前,但众所周知,有时某些事件可能会提前发生(通常是 draw 事件)。

在您的情况下,您的surface_set_target()调用似乎发生在create事件之前。

您可以通过在使用表面之前检查“光”是否存在的条件来避免这种情况。

于 2019-02-16T20:13:10.187 回答