Как известно, YoYo Games - компания-разработчик Game Maker - полностью прекратила поддержку последней "классической" версии программы под номером 8.1, не говоря уже о более ранних. Причина - полная концентрация на разработке Game Maker: Studio.
Однако, как не менее известно, многие разработчики всё ещё не спешат переходить на, как её позиционируют создатели, "суперсовременную, часто обновляемую и вапще самую крутую" Game Maker: Studio. Причины тому самые разные - начиная отсутствием денег на покупку подходящей редакции GM:S и заканчивая банальным неприятием изменений, произошедших с программой. Тем не менее, это не решает проблем, возникающих вследствие ошибок в "классических" версиях GM, многие из которых так и не были в конце концов исправлены. Но Game Maker удивителен ещё и тем, что там практически для каждой ошибки можно найти так называемый "обходной путь" (workaround), т.е. последовательность действий, позволяющую так или иначе избежать проявления того или иного бага программы.
Мне показалось несправедливым, что разработчики не делятся такими вещами между собой, поэтому я решил попробовать исправить эту ситуацию.
В этой теме я предлагаю всем желающим описывать и обсуждать возможные обходные пути для багов
последней из "классических" и больше не поддерживаемых версий GM - 8.1.141. В свою очередь я буду коллекционировать их в этом сообщении.
Будет очень классно, если админы прилепят эту тему.
Итак, начнём.
Проблема: На некоторых видеокартах при рисовании прямоугольников через
draw_rectangle() и
draw_rectangle_color() происходит вычитание единицы из x2 и y2. Это приводит к проблемам наподобие
этой.
Решение: Прибавляйте 0.5*sign(x2-x1) к x2 и 0.5*sign(y2-y1) к y2 перед рисованием.
Эффективность: Полная
Проблема: У объектов, не имеющих спрайтов, переменная
image_index бесконечно увеличивается каждый шаг.
Решение: При создании объекта присваивайте переменной
image_speed значение 0 (
нашёл FanTom).
Эффективность: Полная
Проблема: Вызов функции
wd_message_set_text() из стандартного расширения
GM Windows Dialogs провоцирует ошибки "Unknown software exception" и "Runtime error 217" после завершения работы GM-программы.
Решение: Выполните перед завершением работы следующий код:
wd_message_set_text('');
Эффективность: Полная
Проблема: При отрисовке графики с полупрозрачностью на сурфейс прозрачность рисуемых пикселей не складывается с прозрачностью изначальных, а заменяет её собой.
Решение: Выполните в конце отрисовки на сурфейс следующий код:
draw_set_blend_mode(bm_add);
draw_set_color(c_black);
draw_set_alpha(1);
draw_rectangle(0, 0, ШИРИНА_СУРФЕЙСА, ВЫСОТА_СУРФЕЙСА, false);
draw_set_blend_mode(bm_normal);
Эффективность: Полная
Проблема: При одновременном проигрывании нескольких звуков функцией
sound_play() в Windows 8.x (и более новых) игра может вылететь.
Решение: Выполняйте
sound_stop() перед вызовом
sound_play():
sound_stop(snd);
sound_play(snd);
Более изощрённым, но и в достаточной мере универсальным решением проблемы можно назвать взятие из реестра версии NT-ядра Windows и вызова sound_stop() в том случае, если версия превышает или равна 6.2 (версия ядра Windows 8).
Эффективность: Полная, но требует тестирования - были неподтверждённые сообщения о вылетах даже при использовании этого способа.
Проблемы:1) Многие старые DLL'ки и расширения (в том числе и стандартное
GM Windows Dialogs) не поддерживают кодировку UTF-8.
2) Функция
string_insert() не была переписана для использования кодировки UTF-8.
Решение: Используйте расширение
Codepage Converter для конвертирования строк в национальные кодировки, использовавшиеся в версиях GM до 8.1.
Эффективность: Полная для случая №1 и частичная для случая №2, так как строку не удастся корректно сконвертировать в том случае, если она будет содержать символы различных национальных кодировок.
Проблемы:1) Попытка изменения параметров экрана через стандартные функции GM (т.е. функции, начинающиеся на "
display_set_") приводит к ошибке "Access violation".
2) Изменение параметров экрана (кроме глубины цвета, см. ниже) сторонней программой во время работы GM-программы приводит к исчезновению изображения в её окне.
3) Использование функции
display_reset() приводит к мерцанию изображения в окне GM-программы.
4) Если запустить две GM-программы одновременно, а затем закрыть одну из них, то изображение в окне другой исчезнет.
5) Изображение в окне GM-программы пропадает после возвращения из спящего режима или разблокировки сеанса.
Решение: Выполните в самом начале работы GM-программы следующий код:
surface_free( surface_create( 0, 0 ) );
Эффективность: Полная для всех вышеперечисленных случаев. Тем не менее, изменение глубины цвета экрана сторонней программой во время работы GM-программы приводит к её вылету без каких-либо сообщений об ошибках даже при использовании этого решения, а другое вряд ли будет найдено.