Game Maker - создание игр | HellRoom Games
Ноябрь 08, 2025, 04:19:41 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.

Войти
Новости:
 
   Начало   Game Maker Помощь Правила форума Поиск Календарь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Пишем Dll на C#  (Прочитано 33570 раз)
0 Пользователей и 1 Гость смотрят эту тему.
S_Kleer
GM Pro user
*

Репутация: 567
Offline Offline

Награды:
За лояльность! [+500 репутации]3 место в Дичайшем джеме #82000 сообщений!За постоянность! [50 дней на форуме]Настоящий игродел!2 место на HellRoom Jam #5, Контраст...
API: GameMaker Studio 2
Сообщений: 2734


« : Март 28, 2015, 17:52:51 »

Всем привет!

Очень давно я хотел найти способ написания dll для Game Maker на C#. Мне удалось найти два видео урока на эту тему:
Видео 1
Видео 2

Но я хочу описать данный метод в статье, т.к. видео на английском языке, и многим может быть не понятно.

Для данной статьи я использовал Visual Studio 2015.
Запускаем Visual Studio и создаём новый проект "Библиоткека классов". Назовём её "MyDll".


После создания проекта вы должны увидеть следующий код:
Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MyDll
{
    public class Class1
    {
    }
}

Давайте создадим простенькую функцию на сложение чисел. Она должна быть статичная и публичная. Я назвал её "Add".
Код:
public static double Add(double a, double b)
{
    return a + b;
}

Стоить отметить, что Game Maker может получать и передавать только double и string аргументы. (т.е. числа с плавающей точкой или строки)
Чтобы заставить эту функцию работать в Game Maker, нужно установить одно расширение. Для этого, нажмите ПКМ в правой части проекта по вкладке "Ссылки", а затем "Управление пакетами NuGet".


В открывшемся окне, выберите вкладку "Обзор", а затем впишите в строку поиска "Dllexport".
Установите его щёлкнув на маленький квадратик справа около версии расширения или на кнопку "Установить".


После установки пакета, откроется окно конфигурации. В нём мы лишь укажем пространство имён, которое будет использовать данный пакет.
Основываясь на видеоуроке, я использовал такое же как и там:
Код:
System.Runtime.InteropServices

Далее нажимаем "Configurate".


Теперь нужно использовать пакет в проекте. Для этого в верхней части кода допишем строчку:
Код:
using System.Runtime.InteropServices;

Перед нашей функцией нужно будет дописать тоже одну строчку:
Код:
[DllExport("Add", CallingConvention.Cdecl)]

Где первый аргументы это название нашей функции, которая будет экспортироваться, а второй аргумент это тип вызова. (По умолчанию он Cdecl)
Данную строчку кода следует писать перед всеми функциями, которые следует экспортировать. (использовать в Game Maker)
Весь код будет выглядеть так:
Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;

namespace MyDll
{
    public class Class1
    {
        [DllExport("Add", CallingConvention.Cdecl)]
        public static double Add(double a, double b)
        {
            return a + b;
        }
    }
}

Далее следует создать новую конфигурацию проекта. Если я правильно понял из видео урока, то Game Maker работает только с теми dll, которые собраны под x86 (разрядностью платформы?)
Для этого, щёлкните на "Any CPU" на панели инструментов, а затем "Диспетчер конфигураций".


В столбце "Платформа" вновь щёлкните на "Any CPU". В открывшемся окне в графе "Новая платформа" выберите "x86". Затем щёлкните ОК.


После этого, конфигурация должна автоматически установиться на "x86".
Осталось лишь собрать проект. Для этого щёлкните по "Сборка", а затем "Собрать решение".


Если в проекте нет ошибок, то проект успешно соберётся.

Далее подключим dll к проекту Game Maker. Для данного урока я использовал Game Maker Studio 2 (Но и в GMS 1.4 тоже всё работает).
Создадим новый проект и создадим новое расширение.
В открывшемся окне, щёлкните на квадратную кнопку в графе "Files", а затем "Add File".


Добавим нашу dll. По умолчанию, она храниться по этому пути:
Код:
C:\Users\UserName\Documents\Visual Studio 2015\Projects\MyDll\MyDll\bin\x86\Debug

После добавления файла, щёлкните по нему два раза ЛКМ. В открывшемся окне щёлкните на квадратную кнопку в графе "Functions", а затем "Add Function"


Откроется окно в котором нужно прописать вызов функции из нашей dll.

Name - название функции, которая будет использоваться в Game Maker
External Name - название функции внутри dll
Help - подсказка при наборе название функции в коде
ReturnType - что возвращает функция из dll, число или строку (double/string)
Arguments - Количество аргументов в данной функции.

Следует настроить её так:


ReturnType следует указать double, т.к. у нас складывается 2 числа и возвращается результат.
Так же, нужно добавить 2 аргумента типа double, чтобы передать 2 числа для сложения в dll.

Собственно, на этом и всё. Можете проверить данную функцию. Пропишем при нажатии клавиши Enter какого либо объекта небольшой код:
Код:
var sum = add(10, 18);
show_message(sum);

Должно высветиться сообщение с текстом 28.
Всем спасибо за внимание! Надеюсь у всех всё получится.
Если есть какие либо неточности в статье или ошибки, можете меня поправить.


* ExportDll.7z (3.47 Кб - загружено 980 раз.)
« Последнее редактирование: Октябрь 09, 2017, 12:24:48 от S_Kleer » Записан

Коты - Мирители
truezipp
Участник
****

Репутация: 79
Offline Offline

Пол: Мужской
Награды:
За постоянность!3 место в конкурсе
API: GameMaker Studio Pro
Деятельность: кодер, художник, музыкант, геймдизайнер
Сообщений: 204



WWW
« Ответ #1 : Апрель 07, 2015, 11:15:10 »

Не забудьте вместе с DLL-кой еще и .Net Framework таскать нужной версии.
Записан

exotic fishing (android / win) | greedy bot (android / win)
Dmi7ry
Гл. Администратор
*

Репутация: 1379
Offline Offline

Пол: Мужской
Награды:
5000 сообщений!За постоянность! [200 дней на форуме]За лояльность! [+1000 репутации]За помощь в развитии форума!Знаток Game Maker!За помощь новичкам!
API: GameMaker Studio Master
Деятельность: Code, design
Сообщений: 6626



WWW
« Ответ #2 : Апрель 07, 2015, 11:49:18 »

Не забудьте вместе с DLL-кой еще и .Net Framework таскать нужной версии.
В абсолютном большинстве случаев это не требуется, так как по умолчанию уже есть в винде.
Записан

- А какой, собственно, командой процессора колобок ест черта?
- Командой EAT...
Справка и FAQ в правом верхнем углу...
lucky7
Посетитель
**

Репутация: 1
Offline Offline

API: GameMaker Studio Standard
Сообщений: 22


« Ответ #3 : Октябрь 27, 2016, 20:46:27 »

Попробовал раде эксперимента и опыта всё сделать по инструкции, но что то не работает. Пож-ста может кто подскажет, что делаю не так?
Записан
Dmi7ry
Гл. Администратор
*

Репутация: 1379
Offline Offline

Пол: Мужской
Награды:
5000 сообщений!За постоянность! [200 дней на форуме]За лояльность! [+1000 репутации]За помощь в развитии форума!Знаток Game Maker!За помощь новичкам!
API: GameMaker Studio Master
Деятельность: Code, design
Сообщений: 6626



WWW
« Ответ #4 : Октябрь 27, 2016, 22:13:01 »

Инструкция 100% рабочая, недавно специально проверял (с той только разницей, что я dll подключал как расширение, а не через функцию external_define).
Возможно, что вы пути некорректные указали к ilasm и ildasm.
Записан

- А какой, собственно, командой процессора колобок ест черта?
- Командой EAT...
Справка и FAQ в правом верхнем углу...
lucky7
Посетитель
**

Репутация: 1
Offline Offline

API: GameMaker Studio Standard
Сообщений: 22


« Ответ #5 : Октябрь 28, 2016, 18:11:52 »

Спасибо за ответ, но пути вроде как правильно указаны

Единственное различие моих действий от урока, то что я собираю dll в VS 12.. Подумаю, что ещё не так может делаю..
Записан
Dmi7ry
Гл. Администратор
*

Репутация: 1379
Offline Offline

Пол: Мужской
Награды:
5000 сообщений!За постоянность! [200 дней на форуме]За лояльность! [+1000 репутации]За помощь в развитии форума!Знаток Game Maker!За помощь новичкам!
API: GameMaker Studio Master
Деятельность: Code, design
Сообщений: 6626



WWW
« Ответ #6 : Октябрь 28, 2016, 18:14:04 »

Единственное различие моих действий от урока, то что я собираю dll в VS 12.. Подумаю, что ещё не так может делаю..
Я в 2015-ой собирал, так что вряд ли это влияет (ну и тип сборки был Release, а не Debug).
Записан

- А какой, собственно, командой процессора колобок ест черта?
- Командой EAT...
Справка и FAQ в правом верхнем углу...
lucky7
Посетитель
**

Репутация: 1
Offline Offline

API: GameMaker Studio Standard
Сообщений: 22


« Ответ #7 : Октябрь 28, 2016, 18:41:14 »

Собрал в Release, ничего не поменялось. Самое интересное, скачал готовый пример из темы
http://forum.hellroom.ru/index.php?topic=3507.0

но при запуске аналогичная ошибка. Чуть позже попробую на другой машине и другой версии GMS попробовать повторить свои действия.


Добавлено: Октябрь 28, 2016, 21:51:38
Пересборка на другой машине, на последней обновленной лиц. версии GMS дала тот же результат. ОС Win 7 64 bit. Но после того, как попробовал собрать GM проект под GM 8.1 всё заработало без каких либо доп. действий. Подозреваю, что не хватает каких то библиотек фреймворка, но каких именно понять не могу, либо на GMS есть какие то особенности\отличия использования сторонних библиотек (использует библиотеку из другой версии фреймворка).

Dmi7ry, а вы проверяли на GMS или GM?
« Последнее редактирование: Октябрь 28, 2016, 21:51:38 от lucky7 » Записан
Dmi7ry
Гл. Администратор
*

Репутация: 1379
Offline Offline

Пол: Мужской
Награды:
5000 сообщений!За постоянность! [200 дней на форуме]За лояльность! [+1000 репутации]За помощь в развитии форума!Знаток Game Maker!За помощь новичкам!
API: GameMaker Studio Master
Деятельность: Code, design
Сообщений: 6626



WWW
« Ответ #8 : Октябрь 28, 2016, 22:12:51 »

GMS конечно же.
Записан

- А какой, собственно, командой процессора колобок ест черта?
- Командой EAT...
Справка и FAQ в правом верхнем углу...
lucky7
Посетитель
**

Репутация: 1
Offline Offline

API: GameMaker Studio Standard
Сообщений: 22


« Ответ #9 : Октябрь 30, 2016, 08:20:54 »

Подключил ту же свою DLL как расширения, всё без каких либо вопросов стало работать. Буду использовать тогда пока такой способ.
Записан
S_Kleer
GM Pro user
*

Репутация: 567
Offline Offline

Награды:
За лояльность! [+500 репутации]3 место в Дичайшем джеме #82000 сообщений!За постоянность! [50 дней на форуме]Настоящий игродел!2 место на HellRoom Jam #5, Контраст...
API: GameMaker Studio 2
Сообщений: 2734


« Ответ #10 : Октябрь 09, 2017, 12:06:40 »

Статья обновлена.
Записан

Коты - Мирители
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  

HellRoom Games © 2006-2012 All Rights Reserved
Powered by SMF 1.1.21 | SMF © 2013, Simple Machines
Страница сгенерирована за 0.118 секунд. Запросов: 30.