错误:尝试设置不存在的表面目标

时间:2019-01-17 13:57:15

标签: gml

我当时正在游戏制造商工作室2上编程一个很酷的灯光效果,它起作用了,所以我决定将游戏全屏显示,但是,一旦我将游戏全屏显示,就会弹出错误提示:

  

尝试设置不存在的表面目标。

这是代码。

**obj_lighting:**

*create:*

color = c_ltgray;

globalvar light;

light = surface_create(room_width,room_height);

depth = -999;

*step:*

surface_set_target(light);

draw_set_color(color);

draw_rectangle(0,0,room_width,room_height,false);

surface_reset_target();

*draw:*

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);



**obj_player:**

*end step:*

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:**

*create:*

window_set_fullscreen(true);

2 个答案:

答案 0 :(得分:0)

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

对于您而言,您的 surface_set_target()调用似乎发生在 create 事件之前。

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

答案 1 :(得分: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事件中的代码正在将内容绘制到表面上-尽管它起作用,但会减慢您的游戏速度。最好将所有与绘图相关的步骤放在您的draw事件中,因此也应将该步骤代码也移到draw事件中(在表面下存在检查!)

然后您遇到另一个问题:您的obj_player实例试图引用在对象“ obj_lighting”中创建的曲面。但是,变量light在您的obj_player中是未知的,因此您需要引用它:obj_lighting.light可以做到这一点。然后再次确保进行表面检查,最好在绘制事件中全部进行!