Работая с одним из недавних проектов, я наткнулся на несколько проблем, встречаемых многими - даже если вы делаете игру лишь для 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.
Развлекайтесь 🙂
Привет. Где можно найти все действия для shell_do?
Зависят от типа файла, это type/verb в ShellExecute
Сделай функции для работы с папками.
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
И так далее…
(для уточнения читающим, функции работы с папками и многие другие покрыты в моем более новом расширении)
object_set_parent
и
execute_string
добавишь?
Увы, указанные функции остаются на совести движка, внешней DLL-кой их просто так добавить нельзя.
execute_string нередко можно заменить на asset_get_index (если он использовался для поиска ресурсов), но для полноценной версии функции нужно писать интерпретатор GML на самом же GML, что требует немалых усилий и несет с собой другие проблемы.
Можно добавить функции загрузки ресурсов из не-песочной папки? Например спрайты, бекграунды, звуки. Было бы очень полезно для разработки в несколько человек, когда художнику например ненужно покупать ГМС чтобы изменить ресурс «на лету»
Очень полезное дополнение. Я бы использовал его, чтобы синхронизировать данные между несколькими играми.