ОШИБКА: Попытка установить цель поверхности, которая не существует

Я программировал классный световой эффект в Game Maker Studio 2, это сработало, поэтому я решил сделать игру полноэкранной, однако, как только я сделал игру полноэкранной, выскочила ошибка:

Попытка установить цель на поверхности, которой не существует.

вот код.

obj_lighting:

Создать мероприятие:

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

obj_player:

Событие конечного шага:

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

person Cat_coder    schedule 17.01.2019    source источник


Ответы (2)


Предположительно, события create происходят раньше других событий, но известно, что иногда некоторые события могут происходить раньше (обычно событие рисования).

Похоже, что в вашем случае ваш вызов surface_set_target() происходит до события create.

Этого можно избежать, установив условие, проверяющее наличие «света» перед использованием поверхности.

person Fox    schedule 16.02.2019
comment
Это на самом деле неизвестно, потому что это неправда. События рисования никогда не происходят до событий создания: docs2.yoyogames.com/ source/_build/2_interface/1_editors/events/ Ошибка, которую он видит, связана с тем, что поверхности изменчивы. - person Rob; 05.06.2019

Ошибка, которую вы получаете, связана с тем, что поверхности изменчивы, как указано в документах:

Во-первых, вы должны понимать, что поверхности (кроме поверхности приложения) являются "изменчивыми". Это означает, что если устройство или окно теряют фокус или сворачиваются (хорошие примеры — когда появляется экранная заставка в 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);
}

это воссоздаст поверхность, если она когда-либо будет разрушена.

Второе исправление, которое вы должны применить, заключается в том, что код в вашем шаговом событии рисует что-то на поверхности — хотя это работает, это замедляет вашу игру. Лучше поместить все шаги, связанные с рисованием, в событие рисования, поэтому переместите код этого шага также в событие рисования (под поверхностью существует проверка!)

Тогда у вас есть другая проблема: ваш экземпляр obj_player пытается сослаться на поверхность, созданную в объекте «obj_lighting». Однако переменная light неизвестна в вашем obj_player, поэтому вам нужно будет сослаться на нее: obj_lighting.light сделает это. Опять же, убедитесь, что вы выполняете проверки поверхности и, желательно, делаете все это во время розыгрыша!

person Rob    schedule 05.06.2019