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. Очень полезное дополнение. Я бы использовал его, чтобы синхронизировать данные между несколькими играми.

Добавить комментарий для YounYokel Отменить ответ

Ваш адрес email не будет опубликован.

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