GameMaker: Windows-специфичные функции для Studio

Работая с одним из недавних проектов, я наткнулся на несколько проблем, встречаемых многими - даже если вы делаете игру лишь для Windows в GameMaker: Studio, вы не можете работать с файлами вне папки программы в AppData (нельзя даже работать с папкой, где программа установлена). Так же нет функций для открытия файлов в внешних программах, так что никаких вам "readme" в папке программы с открытием их из игры, никаких портативных файлов настроек, некоторых других вещей... грустно, в общем-то.
Поэтому я потратил вечер и сделал компактный DLL, который добавляет эквиваленты павшим функциям (sleep, execute_shell, I/O без песочницы) для Windows таргета. Поддерживаемые функции следующие:

delay

delay(задержка_в_мс)

Идентичен существовавшей ранее функции sleep(ms). Приостанавливает выполнение игры на указанное количество миллисекунд. К примеру,

delay(2500)

Приостановит выполнение игры на 2.5 секунд.

shell_do

shell_do(file, action)

Запрашивает указанное действие над файлом по указанному пути. Типичные действия это "open", "edit", "print", и доступность действий зависит от настроек системы.

shell_execute

shell_execute(path, args)

Идентично execute_shell. С помощью этого можно так же открывать программы с аргументами.

shell_execute_at

shell_execute_at(file, args, directory)

Подобно shell_execute, но позволяет указать рабочую папку для программы\файла. Это может быть полезным, если вы используете внешние программы, и не хотите указывать абсолютные пути или копировать их в корневую папку игры.

file_text_get

file_text_get(path)

Возвращает строку с содержимым файла по указанному пути (без "песочницы"). Если файла нет, или произошла ошибка при чтении, возвращается пустая строка.

file_text_put

file_text_put(path, contents)

Заменяет содержимое файла по указанному пути (без "песочницы") указанным текстом. Если файла нет, он будет создан. Возвращает статус, был ли текст успешно записан.

get_color_win

get_color_win(default_color)

Аналог get_color из старых версий программы.

file_copy_win

file_copy_win(path, newpath)

Функция для копирования файлов без ограничений "sandbox". Использует абсолютные пути.

Так же, приложенный пример демонстрирует использование большинства из этих функций.
Скачиваемые файлы:

Пример + расширение Исходный код DLL-ки

Ревизии

  • 23 января, 2016:
    Исправлен недочет, из-за которого записанные\считанные через file_text_* файлы не "закрывались" автоматически, блокируя их изменение сторонними программами.
    Пример теперь распространяется в качестве ZIP архива (для избежания проблем с импортом).
    Исходный код библиотеки можно теперь скачать как с примером, так и отдельно.
    Убрана функция shell_open из-за нестабильной работы на некоторых системах. Используйте shell_do("open", path) вместо неё.
    Добавлены функции get_color_win, window_set_caption_ext, file_copy_win.

Развлекайтесь 🙂

Похожие записи

GameMaker: Windows-специфичные функции для Studio: 8 комментариев

  1. Сделай функции для работы с папками.
    directory_exsists_glob()
    directory_create_glob()
    directory_delete_glob()
    Потому, что стандартные функции GMS не находят глобальных папок, нельзя проверить существование папки вне песочницы на некоторых системах.

    Что ещё не работает в GMS (или я просто не нашел после перехода):
    Определение системного диска, с которого запущена винда. Можно только определить букву диска, на котором установлена игра.

    Отдельной крайне полезной функцией в дополнение к этому была бы
    os_get_user_name() которая просто выдавала бы строку с именем текущего пользователя ОС (аналогично использованию в путях %USERNAME%).
    Идеально было бы сделать функцию преобразующую переменные абсолютных путей windows в готовые для использования строковые значения:
    %USERNAME% > Fox
    %LOCALAPPDATA% > C:\Users\Fox\AppData\Local
    И так далее…

    • Увы, указанные функции остаются на совести движка, внешней DLL-кой их просто так добавить нельзя.
      execute_string нередко можно заменить на asset_get_index (если он использовался для поиска ресурсов), но для полноценной версии функции нужно писать интерпретатор GML на самом же GML, что требует немалых усилий и несет с собой другие проблемы.

  2. Можно добавить функции загрузки ресурсов из не-песочной папки? Например спрайты, бекграунды, звуки. Было бы очень полезно для разработки в несколько человек, когда художнику например ненужно покупать ГМС чтобы изменить ресурс «на лету»

  3. Очень полезное дополнение. Я бы использовал его, чтобы синхронизировать данные между несколькими играми.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.