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

Я программировал крутой эффект освещения на 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);

Ответы [ 2 ]

0 голосов
/ 05 июня 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 сделает это. Опять же, убедитесь, что вы делаете проверки поверхности и, желательно, все это в вашем событии рисования!

0 голосов
/ 16 февраля 2019

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

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

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

...