Часто приходится сталкиваться с проблемой когда случайно запускается вторая копия (уже скомпилированной) игры. В возможностьях GameMaker не никакого функционала что бы предотвратить данное событие. Поэтому я написал небольшое DLL расширение на c++ к мейкеру.
Суть его заключается в использовании функции CreateMutex: она используется для защиты общего ресурса от одновременного доступа несколькими потоками или процессами.
#define func extern "C" __declspec(dllexport)
#include <windows.h>
func double GM_CreateMutex(char* mu)
{
HANDLE hMutex = OpenMutex(MUTEX_ALL_ACCESS, 0, mu);
if (hMutex == NULL)
{
hMutex = CreateMutex(0, 0, mu);
if (hMutex == NULL) { return -2; }
else { return 1; }
}
else { return -1; }
}
Теперь достаточно только добавить забилденную DLL в проект:
И можно использовать в коде в событии Create любого объекта в комнате(либо в коде создании первой комнаты):
if GM_CreateMutex(game_project_name + string(game_id))==-1 then game_end();
Функция GM_CreateMutex получает текстовый параметр нашего mutex который мы хотим оставить за данным приложением. Можно использовать любой НО уникальный строковой параметр, в данном примере я использую имя проекта и его уникальный игровой id.
Возвращает значение -1 если mutex создать не удалось(т.е. он уже был зарезервирован первой копией запущенной игры)
Возвращает значение 1 если mutex создать удалось, т.е. имя было свободно, и семафор был зарезервирован текущей программой.