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