我当时正在游戏制造商工作室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);
答案 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
可以做到这一点。然后再次确保进行表面检查,最好在绘制事件中全部进行!