Основное внимание уделяется созданию многопользовательской игры на Emscripten, SDL2, socket.io, nodejs.
Изучаем Emscripten
Компиляция простой программы описана на http://kripken.github.io/emscripten-site/docs/getting_started/Tutorial.html#running-emscripten
Код простого примера использования SDL2 и emcc: https://gist.github.com/derofim/c00a8ce4c7233862ecdd
Компилировать командой emcc source.cpp -s USE_SDL=2 -s FULL_ES2=1 --preload-file res/img -o publish\emsripten\index.html -O3 -s ALLOW_MEMORY_GROWTH=1 -s USE_SDL_IMAGE=2 -s USE_SDL_TTF=2 -s SDL2_IMAGE_FORMATS="['png']"
Здесь res/img - папка с ресурсами, publish\emsripten\index.html - результат компиляции.
Cmake + Emscripten
Попробуем скомпилировать с помощью более удобного способа. Я предпочитаю cmake, им можно сгенерировать файлы для редактора ( call cmake .. -G"Visual Studio 14" ), а также готовую программу ( cmake --build . )
Скачиваем в одну папку файлы https://gist.github.com/derofim/c052308cc863fbfbb893
Наиболее интересны файлы CMakeLists.txt, emc-cmk.bat, shell.html.
emc-cmk.bat - главный скрипт, его запускаем для построения.
CMakeLists.txt используется для компиляции нужных нам файлов, при желании можно использовать другие генераторы (пример cmk.bat)
То же можно было сделать и с помощью emcc вручную (пример в build.bat) и даже используя gcc (пример gpp.bat)
Создание .lib библиотек и Emscripten
Задача - использовать библиотеку lib в проекте main.
Содержимое папки testlib: https://gist.github.com/derofim/7cfbafa452a1569d5f1f
Компилируем библиотеку получая .bc файл (флаг -I говорит о папке с заголовочными файлами):
call emcc lib.cpp -I"%folder%" -o lib.bc -O3 -Werror
Компилируем проект:
Соделржимое папки mainlib: https://gist.github.com/derofim/7fac8602b61c0c75e845
call emcc main.cpp lib.bc -I"%folder%" -I"D:\CppTests\testlib\testlib" -o index.html -O2 -Werror -s WARN_ON_UNDEFINED_SYMBOLS=1
Вызов javascript функций
Простой способ (далеко не самый лучший) - использование EM_ASM, т.е. код на javascript вставляется в C++.
Из javascript функции можно вызывать с помощью cwrap. Не забываем оборачивать функции в extern "C" { ... }, добавлять EMSCRIPTEN_KEEPALIVE и использовать EXPORTED_FUNCTIONS="['_main', '_finish']"
int_sqrt = Module.cwrap('int_sqrt', 'number', ['number']);
Пример такого использования (альфа версия): https://gist.github.com/derofim/fdbce3632ea07b19f5b6
Исользование javascript библиотек и C++ (лучший выход). Используем параметр --js-library!
Можно обычный создать код на C++, без javascript вставок (что скорее всего и нужно). Результат будет в виде:
Функция extern void connectSocket(); будет взята из js файла (в примере это unicode_library.js) вида:
Компилирется такой код командой вроде call emcc main.cpp lib.bc -I"%folder%" -I"D:\CppTests\testlib\testlib" -o index.html -O2 -Werror -s WARN_ON_UNDEFINED_SYMBOLS=1 --js-library "unicode_library.js"