Форум программистов, компьютерный форум, киберфорум
Программирование игр
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.94/18: Рейтинг темы: голосов - 18, средняя оценка - 4.94
Угадываю функции...
2 / 2 / 0
Регистрация: 18.11.2019
Сообщений: 77
1

Какой движок лучше выбрать

18.06.2020, 08:23. Просмотров 3450. Ответов 53
Метки нет (Все метки)

Здравствуйте. Имеется древний ноут с windows 7. Юнити на нём лагает (да и учить шарп как то не хочется), Unreal Engine тоже. Посоветуете какой-нибудь современный малотребовательный игровой движок для C++? А то кодить на билдере 2009 года мне уже как-то стыдно
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.06.2020, 08:23
Ответы с готовыми решениями:

Какой движок лучше
Я хочу создать 3д игру в стиле action, нашел два движка Ogre SDK и Irrlicht Engine SDK. Подскажите...

Какой движок выбрать 2d?
Хочу подучить язык java и возможно выучить ещё парочку типа lua или python. Есть заодно желание...

Какой движок выбрать?
Какой движок выбрать для RST стратегии? Желательно на C#, но можно и на другом.

Подскажите, какой игровой движок выбрать
Посоветуйте, какой движок можно выбрать, если я хочу сделать проект по типу: Star Wars: Knights of...

53
Угадываю функции...
2 / 2 / 0
Регистрация: 18.11.2019
Сообщений: 77
22.06.2020, 08:32  [ТС] 21
Цитата Сообщение от 8Observer8 Посмотреть сообщение
хотя назвали вы её 32 бита
Разве?)
Цитата Сообщение от 8Observer8 Посмотреть сообщение
нужно проследить, что вы скачали SFML 64 бита
Да, вы правы, я по незнанию скачал 32 бита (хотя всё остальное вроде 64 бит). Попробую скачать другую версию.



Добавлено через 26 минут
Однако! Решил я кликнуть правой кнопкой мыши по папке проекта -> добавить библиотеку. Пожмякал там разные кнопочки и добавил к проекту libsfml-window.a - и о чудо: ошибок стало меньше (с 20 до 7). Всё таки это была моя лажа. Вот только там можно добавить только одну библиотеку за раз, а их там много...
Вот, к слову, текст, который добавила сама ide:
win32: LIBS += -L$$PWD/../SFML-2.5.1/lib/ -lsfml-graphics

INCLUDEPATH += $$PWD/../SFML-2.5.1/include
DEPENDPATH += $$PWD/../SFML-2.5.1/include

win32:!win32-g++: PRE_TARGETDEPS += $$PWD/../SFML-2.5.1/lib/sfml-graphics.lib
else:win32-g++: PRE_TARGETDEPS += $$PWD/../SFML-2.5.1/lib/libsfml-graphics.a
0
Угадываю функции...
2 / 2 / 0
Регистрация: 18.11.2019
Сообщений: 77
22.06.2020, 08:53  [ТС] 22
Подредактировал я вышеупомянутые строчки, и получилось:
win32: LIBS += -L$$PWD/../SFML-2.5.1/lib/ -lsfml-audio -lsfml-graphics -lsfml-main -lsfml-network -lsfml-window -lsfml-system

win32-g++: PRE_TARGETDEPS += $$PWD/../SFML-2.5.1/lib/libsfml-graphics.a
win32-g++: PRE_TARGETDEPS += $$PWD/../SFML-2.5.1/lib/libsfml-audio.a
win32-g++: PRE_TARGETDEPS += $$PWD/../SFML-2.5.1/lib/libsfml-main.a
win32-g++: PRE_TARGETDEPS += $$PWD/../SFML-2.5.1/lib/libsfml-network.a
win32-g++: PRE_TARGETDEPS += $$PWD/../SFML-2.5.1/lib/libsfml-window.a
win32-g++: PRE_TARGETDEPS += $$PWD/../SFML-2.5.1/lib/libsfml-system.a

INCLUDEPATH += "C:\Users\User\Desktop\SFML-2.5.1\include"
DEPENDPATH += "C:\Users\User\Desktop\SFML-2.5.1\include"
И проект успешно компилируется! Но вот работать отказывается. Перетащил dll-ки к эксешнику, и получил следующее:
Какой движок лучше выбрать

(Похожую картину я наблюдал, когда пытался прикрутить OpenGL к Code::Blocks)

upd:
Тему можно закрывать. Внимательно вчитавшись в название понял, что не хватает не sfml дллки, а std. Включив голову, пошёл я в папку bin нового компилятора, перетащил оттуда всё к эксешнику и всё заработало! Спасибо всем кто помогал. Ура! Ура! Ура!
0
4176 / 2282 / 387
Регистрация: 05.10.2013
Сообщений: 6,385
Записей в блоге: 177
22.06.2020, 09:20 23
Цитата Сообщение от MiKITA17 Посмотреть сообщение
Разве?)
Да, не назвали. Опять я поторопился. Надо мне быть внимательнее.

Цитата Сообщение от MiKITA17 Посмотреть сообщение
Решил я кликнуть правой кнопкой мыши по папке проекта -> добавить библиотеку.
Это я не пробовал. Надо будет попробовать.

Я создал проект "Qt Console" (до этого создавал "Other Project" > "Empty qmake Project"). Скопировал в .pro новые настройки из прошлого проекта. Работает. Попробуйте временно разархивировать SFML, например, на диск "C", чтобы исключить проблему с путями. У меня на диске "E" есть папку "Libs", где хранятся разные библиотеки:

.pro

Код
QT -= gui

CONFIG += c++11 console
CONFIG -= app_bundle

CONFIG += console c++11
CONFIG -= qt

LIBS += -L"E:\Libs\SFML-2.5.1-windows-gcc-7.3.0-mingw-32-bit\lib"
LIBS += -L"E:\Libs\SFML-2.5.1-windows-gcc-7.3.0-mingw-32-bit\bin"

INCLUDEPATH += "E:\Libs\SFML-2.5.1-windows-gcc-7.3.0-mingw-32-bit\include"
DEPENDPATH  += "E:\Libs\SFML-2.5.1-windows-gcc-7.3.0-mingw-32-bit\include"

CONFIG(release, debug|release): LIBS += -lsfml-audio -lsfml-graphics -lsfml-system -lsfml-network -lsfml-window
CONFIG(debug  , debug|release): LIBS += -lsfml-audio -lsfml-graphics -lsfml-system -lsfml-network -lsfml-window

# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

SOURCES += \
        main.cpp

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
Добавлено через 8 минут
Цитата Сообщение от MiKITA17 Посмотреть сообщение
upd:
Тему можно закрывать. Внимательно вчитавшись в название понял, что не хватает не sfml дллки, а std. Включив голову, пошёл я в папку bin нового компилятора, перетащил оттуда всё к эксешнику и всё заработало! Спасибо всем кто помогал. Ура! Ура! Ура!
Очень рад! Чтобы каждый раз не копировать в каждый свой проект SFML .dll'ки, удобнее их скопировать один раз в одну из следующих папок:
  • Если у вас 32-битная система: C:\Windows\System32
  • Если у вас 64-битная система: C:\Windows\SysWOW64

В случае, если захотите отправить EXE кому-то, то, конечно, нужно будет скопировать эти dll'ки к EXE.

Добавлено через 11 минут
Очень рекомендую вам изучать так же фреймворк Qt. В интернете есть много хороших туториалов (можно скачать онлайн-книг), например: http://zetcode.com/gui/qt5/ В этот туториале показано, как рисовать с помощью QPainter, а в последних двух главах показано, как сделать две игры:

Ещё на Qt, я считаю, обязательно нужно изучать OpenGL. Очень хорошие видео инструкции на русском: https://www.youtube.com/channe... bew/videos

Qt + OpenGL ES 2.0 Tutorial 1 Шаблон проекта

Видео
1
4176 / 2282 / 387
Регистрация: 05.10.2013
Сообщений: 6,385
Записей в блоге: 177
22.06.2020, 12:49 24
Я уверен, что сначала нужно тренироваться на всем известных простых играх. Развивать их по своему, по мере получения знаний и навыков. По SFML есть свой раздел на киберфоруме и довольно активный: https://www.cyberforum.ru/sfml/

Посоветую вам отличный канал на русском по SFML: https://www.youtube.com/user/FamTrinli/videos Там полно исходников разных игр.

Особенно мне понравился его урок по Супер Марио: Создание игр на C++: Марио (платформер). Я, правда, ещё не освоил этот урок на практике, но собираюсь в ближайшее время это начать делать.

Видео
1
Угадываю функции...
2 / 2 / 0
Регистрация: 18.11.2019
Сообщений: 77
23.06.2020, 11:04  [ТС] 25
Спасибо за советы! Кстати, порыскав в интернете я не нашёл инструкций по подключению Box2d к Qt, а сам с CMake'ом я работать не умею. Чёт там попытался собрать но ни .lib ни .a не создаётся.
0
4176 / 2282 / 387
Регистрация: 05.10.2013
Сообщений: 6,385
Записей в блоге: 177
23.06.2020, 14:59 26
Цитата Сообщение от MiKITA17 Посмотреть сообщение
я не нашёл инструкций по подключению Box2d к Qt, а сам с CMake'ом я работать не умею.
Я пробовал Box2D в виде портов на C# и JavaScript, а на C++ пока не пробовал. Попробую и отпишусь. С CMake очень просто работать, особенно, через CMake GUI. Процедура всегда одна. Нужно запустить CMake GUI (устанавливается вместе с CMake - https://cmake.org/download/). В первом поле нужно указать директорию с исходниками (ту, где лежит файл CMakeLists.txt). Во втором поле нужно указать пустую директорию, где будут созданы файлы программой CMake (я обычно приписываю к первому пути: "/dist"). Нажать кнопку "Configure". Будет предложено выбрать компилятор (путь к компилятору MinGW g++ должен быть в переменной окружения "Paht"), нужно выбрать "MinGW Makefiles" и "Use default native compilers" (предлагается по умолчанию). Будет предложено поменять какие-нибудь настройки перед генерацией. Ещё раз нужно нажать "Configure" и "Generate". В "dist" будут сгерерированы файлы для компиляции. Переходите в "dist" из консоли. Выполняете команду сборки: mingw32-make. Должны собраться либы.

Бывает, что какие-то библиотеки у меня не собираются. Не смог собрать и не понимаю в чём проблема, не нашёл причину на зарубежных форумах. Например, графический движок OGRE не собирается у меня с помощью MinGW 32. Так же как и Assimp 32-bit крайней версии. А Assimp предыдущей версии собирается нормально. Кстати, я смотрю по исходникам Box2D, что релиз одни делали в 2014, но с другой стороны, разработка активна, потому что крайние доработки были 2 месяца назад: https://github.com/erincatto/box2d Мне нравится, когда есть релизы (на вкладке "releases") потому что собирать с самыми последними изменениями - это отсутствие привязки к версии и чревато получить ошибки.

В общем, я пока писал это сообщение, у меня собирался Box2D и в результате не смог собраться. На этапе сборки (после команды mingw32-make выдало кучу ошибок). Ругается на "std::mutex mutex". Я встречал эту проблему. По-моему, насколько я помню, в компиляторе MinGW 32-bit g++ не реализована поддержка std::mutex. Я попробую поискать какой-нибудь другой 2D движок, и попробую поискать решение этой проблемы с Box2D.

Такие ошибки выдаёт:

Кликните здесь для просмотра всего текста
Код
C:\Users\8Observer8\Downloads\box2d-master\dist>mingw32-make
Scanning dependencies of target box2d
[  0%] Building CXX object src/CMakeFiles/box2d.dir/collision/b2_broad_phase.cpp.obj
[  1%] Building CXX object src/CMakeFiles/box2d.dir/collision/b2_chain_shape.cpp.obj
[  2%] Building CXX object src/CMakeFiles/box2d.dir/collision/b2_circle_shape.cpp.obj
[  2%] Building CXX object src/CMakeFiles/box2d.dir/collision/b2_collide_circle.cpp.obj
[  3%] Building CXX object src/CMakeFiles/box2d.dir/collision/b2_collide_edge.cpp.obj
[  4%] Building CXX object src/CMakeFiles/box2d.dir/collision/b2_collide_polygon.cpp.obj
[  5%] Building CXX object src/CMakeFiles/box2d.dir/collision/b2_collision.cpp.obj
[  5%] Building CXX object src/CMakeFiles/box2d.dir/collision/b2_distance.cpp.obj
[  6%] Building CXX object src/CMakeFiles/box2d.dir/collision/b2_dynamic_tree.cpp.obj
[  7%] Building CXX object src/CMakeFiles/box2d.dir/collision/b2_edge_shape.cpp.obj
[  7%] Building CXX object src/CMakeFiles/box2d.dir/collision/b2_polygon_shape.cpp.obj
[  8%] Building CXX object src/CMakeFiles/box2d.dir/collision/b2_time_of_impact.cpp.obj
[  9%] Building CXX object src/CMakeFiles/box2d.dir/common/b2_block_allocator.cpp.obj
[ 10%] Building CXX object src/CMakeFiles/box2d.dir/common/b2_draw.cpp.obj
[ 10%] Building CXX object src/CMakeFiles/box2d.dir/common/b2_math.cpp.obj
[ 11%] Building CXX object src/CMakeFiles/box2d.dir/common/b2_settings.cpp.obj
[ 12%] Building CXX object src/CMakeFiles/box2d.dir/common/b2_stack_allocator.cpp.obj
[ 13%] Building CXX object src/CMakeFiles/box2d.dir/common/b2_timer.cpp.obj
[ 13%] Building CXX object src/CMakeFiles/box2d.dir/dynamics/b2_body.cpp.obj
[ 14%] Building CXX object src/CMakeFiles/box2d.dir/dynamics/b2_chain_circle_contact.cpp.obj
[ 15%] Building CXX object src/CMakeFiles/box2d.dir/dynamics/b2_chain_polygon_contact.cpp.obj
[ 15%] Building CXX object src/CMakeFiles/box2d.dir/dynamics/b2_circle_contact.cpp.obj
[ 16%] Building CXX object src/CMakeFiles/box2d.dir/dynamics/b2_contact.cpp.obj
[ 17%] Building CXX object src/CMakeFiles/box2d.dir/dynamics/b2_contact_manager.cpp.obj
[ 18%] Building CXX object src/CMakeFiles/box2d.dir/dynamics/b2_contact_solver.cpp.obj
[ 18%] Building CXX object src/CMakeFiles/box2d.dir/dynamics/b2_distance_joint.cpp.obj
[ 19%] Building CXX object src/CMakeFiles/box2d.dir/dynamics/b2_edge_circle_contact.cpp.obj
[ 20%] Building CXX object src/CMakeFiles/box2d.dir/dynamics/b2_edge_polygon_contact.cpp.obj
[ 21%] Building CXX object src/CMakeFiles/box2d.dir/dynamics/b2_fixture.cpp.obj
[ 21%] Building CXX object src/CMakeFiles/box2d.dir/dynamics/b2_friction_joint.cpp.obj
[ 22%] Building CXX object src/CMakeFiles/box2d.dir/dynamics/b2_gear_joint.cpp.obj
[ 23%] Building CXX object src/CMakeFiles/box2d.dir/dynamics/b2_island.cpp.obj
[ 23%] Building CXX object src/CMakeFiles/box2d.dir/dynamics/b2_joint.cpp.obj
[ 24%] Building CXX object src/CMakeFiles/box2d.dir/dynamics/b2_motor_joint.cpp.obj
[ 25%] Building CXX object src/CMakeFiles/box2d.dir/dynamics/b2_mouse_joint.cpp.obj
[ 26%] Building CXX object src/CMakeFiles/box2d.dir/dynamics/b2_polygon_circle_contact.cpp.obj
[ 26%] Building CXX object src/CMakeFiles/box2d.dir/dynamics/b2_polygon_contact.cpp.obj
[ 27%] Building CXX object src/CMakeFiles/box2d.dir/dynamics/b2_prismatic_joint.cpp.obj
[ 28%] Building CXX object src/CMakeFiles/box2d.dir/dynamics/b2_pulley_joint.cpp.obj
[ 28%] Building CXX object src/CMakeFiles/box2d.dir/dynamics/b2_revolute_joint.cpp.obj
[ 29%] Building CXX object src/CMakeFiles/box2d.dir/dynamics/b2_rope_joint.cpp.obj
[ 30%] Building CXX object src/CMakeFiles/box2d.dir/dynamics/b2_weld_joint.cpp.obj
[ 31%] Building CXX object src/CMakeFiles/box2d.dir/dynamics/b2_wheel_joint.cpp.obj
[ 31%] Building CXX object src/CMakeFiles/box2d.dir/dynamics/b2_world.cpp.obj
[ 32%] Building CXX object src/CMakeFiles/box2d.dir/dynamics/b2_world_callbacks.cpp.obj
[ 33%] Building CXX object src/CMakeFiles/box2d.dir/rope/b2_rope.cpp.obj
[ 34%] Linking CXX static library libbox2d.a
[ 34%] Built target box2d
Scanning dependencies of target unit_test
[ 35%] Building CXX object unit-test/CMakeFiles/unit_test.dir/hello_world.cpp.obj
In file included from C:\Users\8Observer8\Downloads\box2d-master\unit-test\hello_world.cpp:27:
C:\Users\8Observer8\Downloads\box2d-master\unit-test\doctest.h:4634:14: error: 'mutex' in namespace 'std' does not name a type
         std::mutex mutex;
              ^~~~~
C:\Users\8Observer8\Downloads\box2d-master\unit-test\doctest.h:4634:9: note: 'std::mutex' is defined in header '<mutex>'; did you forget to '#include <mutex>'?
C:\Users\8Observer8\Downloads\box2d-master\unit-test\doctest.h:2757:1:
+#include <mutex>

C:\Users\8Observer8\Downloads\box2d-master\unit-test\doctest.h:4634:9:
         std::mutex mutex;
         ^~~
C:\Users\8Observer8\Downloads\box2d-master\unit-test\doctest.h: In member function 'virtual void doctest::{anonymous}::XmlReporter::test_case_exception(const doctest::TestCaseException&)':
C:\Users\8Observer8\Downloads\box2d-master\unit-test\doctest.h:4792:34: error: 'mutex' is not a member of 'std'
             std::lock_guard<std::mutex> lock(mutex);
                                  ^~~~~
C:\Users\8Observer8\Downloads\box2d-master\unit-test\doctest.h:4792:34: note: 'std::mutex' is defined in header '<mutex '; did you forget to '#include <mutex>'?
C:\Users\8Observer8\Downloads\box2d-master\unit-test\doctest.h:4792:34: error: 'mutex' is not a member of 'std'
C:\Users\8Observer8\Downloads\box2d-master\unit-test\doctest.h:4792:34: note: 'std::mutex' is defined in header '<mutex '; did you forget to '#include <mutex>'?
C:\Users\8Observer8\Downloads\box2d-master\unit-test\doctest.h:4792:39: error: template argument 1 is invalid
             std::lock_guard<std::mutex> lock(mutex);
                                       ^
C:\Users\8Observer8\Downloads\box2d-master\unit-test\doctest.h:4792:46: error: 'mutex' was not declared in this scope
             std::lock_guard<std::mutex> lock(mutex);
                                              ^~~~~
C:\Users\8Observer8\Downloads\box2d-master\unit-test\doctest.h:4792:46: note: suggested alternative: 'mktemp'
             std::lock_guard<std::mutex> lock(mutex);
                                              ^~~~~
                                              mktemp
C:\Users\8Observer8\Downloads\box2d-master\unit-test\doctest.h: In member function 'virtual void doctest::{anonymous}::XmlReporter::subcase_start(const doctest::SubcaseSignature&)':
C:\Users\8Observer8\Downloads\box2d-master\unit-test\doctest.h:4800:34: error: 'mutex' is not a member of 'std'
             std::lock_guard<std::mutex> lock(mutex);
                                  ^~~~~
C:\Users\8Observer8\Downloads\box2d-master\unit-test\doctest.h:4800:34: note: 'std::mutex' is defined in header '<mutex '; did you forget to '#include <mutex>'?
C:\Users\8Observer8\Downloads\box2d-master\unit-test\doctest.h:4800:34: error: 'mutex' is not a member of 'std'
C:\Users\8Observer8\Downloads\box2d-master\unit-test\doctest.h:4800:34: note: 'std::mutex' is defined in header '<mutex '; did you forget to '#include <mutex>'?
C:\Users\8Observer8\Downloads\box2d-master\unit-test\doctest.h:4800:39: error: template argument 1 is invalid
             std::lock_guard<std::mutex> lock(mutex);
                                       ^
C:\Users\8Observer8\Downloads\box2d-master\unit-test\doctest.h:4800:46: error: 'mutex' was not declared in this scope
             std::lock_guard<std::mutex> lock(mutex);
                                              ^~~~~
C:\Users\8Observer8\Downloads\box2d-master\unit-test\doctest.h:4800:46: note: suggested alternative: 'mktemp'
             std::lock_guard<std::mutex> lock(mutex);
                                              ^~~~~
                                              mktemp
C:\Users\8Observer8\Downloads\box2d-master\unit-test\doctest.h: In member function 'virtual void doctest::{anonymous}::XmlReporter::log_assert(const doctest::AssertData&)':
C:\Users\8Observer8\Downloads\box2d-master\unit-test\doctest.h:4815:34: error: 'mutex' is not a member of 'std'
             std::lock_guard<std::mutex> lock(mutex);
                                  ^~~~~
C:\Users\8Observer8\Downloads\box2d-master\unit-test\doctest.h:4815:34: note: 'std::mutex' is defined in header '<mutex '; did you forget to '#include <mutex>'?
C:\Users\8Observer8\Downloads\box2d-master\unit-test\doctest.h:4815:34: error: 'mutex' is not a member of 'std'
C:\Users\8Observer8\Downloads\box2d-master\unit-test\doctest.h:4815:34: note: 'std::mutex' is defined in header '<mutex '; did you forget to '#include <mutex>'?
C:\Users\8Observer8\Downloads\box2d-master\unit-test\doctest.h:4815:39: error: template argument 1 is invalid
             std::lock_guard<std::mutex> lock(mutex);
                                       ^
C:\Users\8Observer8\Downloads\box2d-master\unit-test\doctest.h:4815:46: error: 'mutex' was not declared in this scope
             std::lock_guard<std::mutex> lock(mutex);
                                              ^~~~~
C:\Users\8Observer8\Downloads\box2d-master\unit-test\doctest.h:4815:46: note: suggested alternative: 'mktemp'
             std::lock_guard<std::mutex> lock(mutex);
                                              ^~~~~
                                              mktemp
C:\Users\8Observer8\Downloads\box2d-master\unit-test\doctest.h: In member function 'virtual void doctest::{anonymous}::XmlReporter::log_message(const doctest::MessageData&)':
C:\Users\8Observer8\Downloads\box2d-master\unit-test\doctest.h:4841:34: error: 'mutex' is not a member of 'std'
             std::lock_guard<std::mutex> lock(mutex);
                                  ^~~~~
C:\Users\8Observer8\Downloads\box2d-master\unit-test\doctest.h:4841:34: note: 'std::mutex' is defined in header '<mutex '; did you forget to '#include <mutex>'?
C:\Users\8Observer8\Downloads\box2d-master\unit-test\doctest.h:4841:34: error: 'mutex' is not a member of 'std'
C:\Users\8Observer8\Downloads\box2d-master\unit-test\doctest.h:4841:34: note: 'std::mutex' is defined in header '<mutex '; did you forget to '#include <mutex>'?
C:\Users\8Observer8\Downloads\box2d-master\unit-test\doctest.h:4841:39: error: template argument 1 is invalid
             std::lock_guard<std::mutex> lock(mutex);
                                       ^
C:\Users\8Observer8\Downloads\box2d-master\unit-test\doctest.h:4841:46: error: 'mutex' was not declared in this scope
             std::lock_guard<std::mutex> lock(mutex);
                                              ^~~~~
C:\Users\8Observer8\Downloads\box2d-master\unit-test\doctest.h:4841:46: note: suggested alternative: 'mktemp'
             std::lock_guard<std::mutex> lock(mutex);
                                              ^~~~~
                                              mktemp
C:\Users\8Observer8\Downloads\box2d-master\unit-test\doctest.h: At global scope:
C:\Users\8Observer8\Downloads\box2d-master\unit-test\doctest.h:4884:14: error: 'mutex' in namespace 'std' does not name a type
         std::mutex                    mutex;
              ^~~~~
C:\Users\8Observer8\Downloads\box2d-master\unit-test\doctest.h:4884:9: note: 'std::mutex' is defined in header '<mutex>'; did you forget to '#include <mutex>'?
         std::mutex                    mutex;
         ^~~
C:\Users\8Observer8\Downloads\box2d-master\unit-test\doctest.h: In member function 'virtual void doctest::{anonymous}::ConsoleReporter::subcase_start(const doctest::SubcaseSignature&)':
C:\Users\8Observer8\Downloads\box2d-master\unit-test\doctest.h:5257:34: error: 'mutex' is not a member of 'std'
             std::lock_guard<std::mutex> lock(mutex);
                                  ^~~~~
C:\Users\8Observer8\Downloads\box2d-master\unit-test\doctest.h:5257:34: note: 'std::mutex' is defined in header '<mutex '; did you forget to '#include <mutex>'?
C:\Users\8Observer8\Downloads\box2d-master\unit-test\doctest.h:5257:34: error: 'mutex' is not a member of 'std'
C:\Users\8Observer8\Downloads\box2d-master\unit-test\doctest.h:5257:34: note: 'std::mutex' is defined in header '<mutex '; did you forget to '#include <mutex>'?
C:\Users\8Observer8\Downloads\box2d-master\unit-test\doctest.h:5257:39: error: template argument 1 is invalid
             std::lock_guard<std::mutex> lock(mutex);
                                       ^
C:\Users\8Observer8\Downloads\box2d-master\unit-test\doctest.h:5257:46: error: 'mutex' was not declared in this scope
             std::lock_guard<std::mutex> lock(mutex);
                                              ^~~~~
C:\Users\8Observer8\Downloads\box2d-master\unit-test\doctest.h:5257:46: note: suggested alternative: 'mktemp'
             std::lock_guard<std::mutex> lock(mutex);
                                              ^~~~~
                                              mktemp
C:\Users\8Observer8\Downloads\box2d-master\unit-test\doctest.h: In member function 'virtual void doctest::{anonymous}::ConsoleReporter::subcase_end()':
C:\Users\8Observer8\Downloads\box2d-master\unit-test\doctest.h:5263:34: error: 'mutex' is not a member of 'std'
             std::lock_guard<std::mutex> lock(mutex);
                                  ^~~~~
C:\Users\8Observer8\Downloads\box2d-master\unit-test\doctest.h:5263:34: note: 'std::mutex' is defined in header '<mutex '; did you forget to '#include <mutex>'?
C:\Users\8Observer8\Downloads\box2d-master\unit-test\doctest.h:5263:34: error: 'mutex' is not a member of 'std'
C:\Users\8Observer8\Downloads\box2d-master\unit-test\doctest.h:5263:34: note: 'std::mutex' is defined in header '<mutex '; did you forget to '#include <mutex>'?
C:\Users\8Observer8\Downloads\box2d-master\unit-test\doctest.h:5263:39: error: template argument 1 is invalid
             std::lock_guard<std::mutex> lock(mutex);
                                       ^
C:\Users\8Observer8\Downloads\box2d-master\unit-test\doctest.h:5263:46: error: 'mutex' was not declared in this scope
             std::lock_guard<std::mutex> lock(mutex);
                                              ^~~~~
C:\Users\8Observer8\Downloads\box2d-master\unit-test\doctest.h:5263:46: note: suggested alternative: 'mktemp'
             std::lock_guard<std::mutex> lock(mutex);
                                              ^~~~~
                                              mktemp
C:\Users\8Observer8\Downloads\box2d-master\unit-test\doctest.h: In member function 'virtual void doctest::{anonymous}::ConsoleReporter::log_assert(const doctest::AssertData&)':
C:\Users\8Observer8\Downloads\box2d-master\unit-test\doctest.h:5272:34: error: 'mutex' is not a member of 'std'
             std::lock_guard<std::mutex> lock(mutex);
                                  ^~~~~
C:\Users\8Observer8\Downloads\box2d-master\unit-test\doctest.h:5272:34: note: 'std::mutex' is defined in header '<mutex '; did you forget to '#include <mutex>'?
C:\Users\8Observer8\Downloads\box2d-master\unit-test\doctest.h:5272:34: error: 'mutex' is not a member of 'std'
C:\Users\8Observer8\Downloads\box2d-master\unit-test\doctest.h:5272:34: note: 'std::mutex' is defined in header '<mutex '; did you forget to '#include <mutex>'?
C:\Users\8Observer8\Downloads\box2d-master\unit-test\doctest.h:5272:39: error: template argument 1 is invalid
             std::lock_guard<std::mutex> lock(mutex);
                                       ^
C:\Users\8Observer8\Downloads\box2d-master\unit-test\doctest.h:5272:46: error: 'mutex' was not declared in this scope
             std::lock_guard<std::mutex> lock(mutex);
                                              ^~~~~
C:\Users\8Observer8\Downloads\box2d-master\unit-test\doctest.h:5272:46: note: suggested alternative: 'mktemp'
             std::lock_guard<std::mutex> lock(mutex);
                                              ^~~~~
                                              mktemp
C:\Users\8Observer8\Downloads\box2d-master\unit-test\doctest.h: In member function 'virtual void doctest::{anonymous}::ConsoleReporter::log_message(const doctest::MessageData&)':
C:\Users\8Observer8\Downloads\box2d-master\unit-test\doctest.h:5330:34: error: 'mutex' is not a member of 'std'
             std::lock_guard<std::mutex> lock(mutex);
                                  ^~~~~
C:\Users\8Observer8\Downloads\box2d-master\unit-test\doctest.h:5330:34: note: 'std::mutex' is defined in header '<mutex '; did you forget to '#include <mutex>'?
C:\Users\8Observer8\Downloads\box2d-master\unit-test\doctest.h:5330:34: error: 'mutex' is not a member of 'std'
C:\Users\8Observer8\Downloads\box2d-master\unit-test\doctest.h:5330:34: note: 'std::mutex' is defined in header '<mutex '; did you forget to '#include <mutex>'?
C:\Users\8Observer8\Downloads\box2d-master\unit-test\doctest.h:5330:39: error: template argument 1 is invalid
             std::lock_guard<std::mutex> lock(mutex);
                                       ^
C:\Users\8Observer8\Downloads\box2d-master\unit-test\doctest.h:5330:46: error: 'mutex' was not declared in this scope
             std::lock_guard<std::mutex> lock(mutex);
                                              ^~~~~
C:\Users\8Observer8\Downloads\box2d-master\unit-test\doctest.h:5330:46: note: suggested alternative: 'mktemp'
             std::lock_guard<std::mutex> lock(mutex);
                                              ^~~~~
                                              mktemp
mingw32-make[2]: *** [unit-test\CMakeFiles\unit_test.dir\build.make:83: unit-test/CMakeFiles/unit_test.dir/hello_world.cpp.obj] Error 1
mingw32-make[1]: *** [CMakeFiles\Makefile2:266: unit-test/CMakeFiles/unit_test.dir/all] Error 2
mingw32-make: *** [Makefile:103: all] Error 2


Добавлено через 5 минут
Я поискал и интернете: box2d mutex errors. В первой же ссылке говориться, что это проблемы с unit-тестами. Я в CMake GUI убрал галочку BOX2D_BUILD_UNIT_TESTS и у меня сборка прошла дальше, но появились другая ошибка, связанная с модулем std::thread:

C#
1
2
3
4
5
6
7
8
9
10
11
[ 53%] Building CXX object testbed/CMakeFiles/testbed.dir/draw.cpp.obj
[ 54%] Building CXX object testbed/CMakeFiles/testbed.dir/imgui_impl_glfw.cpp.obj
[ 55%] Building CXX object testbed/CMakeFiles/testbed.dir/imgui_impl_opengl3.cpp.obj
[ 55%] Building CXX object testbed/CMakeFiles/testbed.dir/main.cpp.obj
C:\Users\8Observer8\Downloads\box2d-master\testbed\main.cpp: In function 'int main(int, char**)':
C:\Users\8Observer8\Downloads\box2d-master\testbed\main.cpp:624:9: error: 'std::this_thread' has not been declared
    std::this_thread::sleep_for(sleepTime);
         ^~~~~~~~~~~
mingw32-make[2]: *** [testbed\CMakeFiles\testbed.dir\build.make:125: testbed/CMakeFiles/testbed.dir/main.cpp.obj] Error 1
mingw32-make[1]: *** [CMakeFiles\Makefile2:357: testbed/CMakeFiles/testbed.dir/all] Error 2
mingw32-make: *** [Makefile:103: all] Error 2
Добавлено через 7 минут
УРА! Я в CMake GUI ещё убрал галочку BOX2D_BUILD_TESTBED. Команда сборки "mingw32-make" отработала без ошибок:

Код
[ 89%] Building CXX object src/CMakeFiles/box2d.dir/dynamics/b2_weld_joint.cpp.obj
[ 91%] Building CXX object src/CMakeFiles/box2d.dir/dynamics/b2_wheel_joint.cpp.obj
[ 93%] Building CXX object src/CMakeFiles/box2d.dir/dynamics/b2_world.cpp.obj
[ 95%] Building CXX object src/CMakeFiles/box2d.dir/dynamics/b2_world_callbacks.cpp.obj
[ 97%] Building CXX object src/CMakeFiles/box2d.dir/rope/b2_rope.cpp.obj
[100%] Linking CXX static library libbox2d.a
[100%] Built target box2d
Чуть попозже попробую подключить Box2D с QtCreator и собрать какой-нибудь простейший пример с SFML для демонстрации.
0
Просто Икс
420 / 137 / 20
Регистрация: 15.12.2009
Сообщений: 399
24.06.2020, 14:57 27
Цитата Сообщение от 8Observer8 Посмотреть сообщение
Бывает, что какие-то библиотеки у меня не собираются. Не смог собрать и не понимаю в чём проблема, не нашёл причину на зарубежных форумах. Например, графический движок OGRE не собирается у меня с помощью MinGW 32
Какая версия? Next (2-ой) или 1.x? (как по мне то 1-ый намного лучше, пусть и без GPU наворотов)
Огр использует сторонние библиотеки (dependencies), которые тоже надо учитывать при сборке определенным компилятором.
А так, учитывая кроссплатформенность Огра, то он должен отлично собираться на GCC (MinGW это IDE) и скорее всего надо было искать решение по версии GCC в твоем MinGW.
1
4176 / 2282 / 387
Регистрация: 05.10.2013
Сообщений: 6,385
Записей в блоге: 177
24.06.2020, 15:26 28
Цитата Сообщение от Mc X Посмотреть сообщение
Какая версия? Next (2-ой) или 1.x?
Та которая на GitHub была примерно два месяца назад. Может быть какие-то модули нужно было бы отключить. На сборку OGRE сейчас не хочется тратить время, потому что почему-то мотивации на него нет. Для 3D на C++ у меня есть графический движок, который встроен в Qt, называется Qt3D. У Qt3D, скорее всего, меньше возможностей, чем у OGRE, но мне должно хватить для моих планов. Я собрал физический движок Bullet (не без проблем). Хочу попробовать подключить Bullet к Qt и отрисовывать 3D объекты с помощью Qt3D. У меня Bullet выдавал кучу ошибок во время конфигурации на MinGW 32 8.1.0. Ошибки удалось исправить путём убирания галочек модулей: типа unit-тестов, примеров, extras и т.д. Оставил только сам Bullet. В Extras в основном модули для симуляции роботов.

Цитата Сообщение от MiKITA17 Посмотреть сообщение
Кстати, порыскав в интернете я не нашёл инструкций по подключению Box2d к Qt, а сам с CMake'ом я работать не умею. Чёт там попытался собрать но ни .lib ни .a не создаётся.
Я подключил, у меня работает связка SFML + Box2D + QtCreator. Я укоротил файл проекта (.pro). Рисунки я подключаю с помощью ресурсов Qt. В коде работа с ресурсами изображений выглядит так:

C++ (Qt)
1
2
3
4
5
6
7
8
    QResource t_resource(":/Data/Images/ground.png"),
              t1_resource(":/Data/Images/player.png"),
              t2_resource(":/Data/Images/objects1.png");
 
    Texture t, t1, t2;
    t.loadFromMemory(t_resource.data(), t_resource.size(), IntRect());
    t1.loadFromMemory(t1_resource.data(), t1_resource.size(), IntRect());
    t2.loadFromMemory(t2_resource.data(), t2_resource.size(), IntRect());
Вот файл проекта целиком:

Код
CONFIG += qt
CONFIG += c++11
CONFIG -= console

INCLUDEPATH += "E:\Libs\Box2D\include"
LIBS += -L"E:\Libs\Box2D\lib"
LIBS += -lbox2d

INCLUDEPATH += "E:\Libs\SFML-2.5.1-windows-gcc-7.3.0-mingw-32-bit\include"
LIBS += -L"E:\Libs\SFML-2.5.1-windows-gcc-7.3.0-mingw-32-bit\lib"
LIBS += -lsfml-graphics -lsfml-system -lsfml-window

SOURCES += \
    main.cpp

RESOURCES += \
    Images.qrc
Отличный урок для знакомства с Box2D на канале FamTrinli: Урок Box2d уроки создания игр

Видео


Я пока сделал только первую часть его игры из урока. Записал гифку с помощью программы ScreenToGif (кстати, отличная программа!)



Миниатюра
Какой движок лучше выбрать
0
Просто Икс
420 / 137 / 20
Регистрация: 15.12.2009
Сообщений: 399
24.06.2020, 16:32 29
Цитата Сообщение от 8Observer8 Посмотреть сообщение
Та которая на GitHub была примерно два месяца назад
Есть две ветки, каждая развивается самостоятельно
https://www.ogre3d.org/about/w... -to-choose
Это в свое время внесло определенную путаницу и честно говоря (на мой взгляд) сыграло не на пользу самому развитию проекта.

Цитата Сообщение от 8Observer8 Посмотреть сообщение
Может быть какие-то модули нужно было бы отключить
Цитата Сообщение от 8Observer8 Посмотреть сообщение
У меня Bullet выдавал кучу ошибок во время конфигурации
Скорее всего с какими-то зависимостями были проблемы или их отсутствием.
В CMake каждая настройка имеет определенный смысл, какая-то требует дополнительную стороннюю библиотеку, какая-то поддержку чего-нибудь и тд. Там надо разбираться, что включаешь или отключаешь и зачем, но в сущности ничего особо сложного в этом нет.
Обычно по каждой опции можно найти информацию, что она значит и зачем нужна. Это независимо сборку чего делаешь, Огра, Bullet, Assimp или любую другую библиотеку

Добавлено через 2 минуты
Собственно, обычно в окне вывода пишет, что именно CMake требуется, если указать путь на какую-то библиотеку, то появляется дополнительное поле где нужно указать путь и тд.
1
Модератор
1425 / 425 / 140
Регистрация: 11.08.2017
Сообщений: 1,445
26.06.2020, 18:15 30
8Observer8, решил сам опробовать этот движок box2d для начала по вашему видео (но на джаве используя оф(?) порт jbox2d). как ни странно но я думал что он куда сложнее, а тут все куда проще в плане использования. но вот получить нужные результаты уже не так просто, с параметрами из видел у меня вышел эффект льда и низкой гравитации))) избавиться от которых не выходит. (переписал не с видео а свой другой 2д проект под этот движок, где сам пытался писать физику). зато с ооп подходом можно не переберить все body из мира а использовать то что использовалось при создании и не нужно userdata ставить. еще вместо перебора всех объектов для определения onGround хорошо работает условие getLinearVelocity().x==0, хотя по идее в максимальной точке прыжка оно тоже выполняется но проблему двойного прыжка и прыжка в падении почти решает
с версиями чтото странное у него. на гите релизов не нашел, скачал последнюю версию, снегерировал vs проект и долго пытался найти lib файлы))) в 19 студии и последней версии либы структура проекта совсем иная. в итоге нашел, подключил и все заработало, но только пришлость внести правки в код из ролика. в userdata приведение к (void *) строки, а в setLinearVelocity требовался еще один bool параметр.
с портом jbox2d вышло не лучше, последняя версия .3 а на гугле .2 от 13 года, на мавене тоже .2 версия, но по начинке jar-ники различаются. а если собирать самому то не будет ни исходников ни доков.
еще ради интереса попробовал libgdx который по сути оказался генератором проекта градл для программирования графики а не движком, при этрм он использует допотопные версии всего, у box2d .1 или ниже
а так впечатление хорошее о движке, только надо разобраться с эффектами льда и малой гравитации
пробовал порт bullet на джаву но он показался чем то недописанным и гайды с плюсов не подошли. надо поискать замену а то раз с 2д у меня самописное ужасно работает то что о 3д говорить
а что такого в этом qt? ведь по сути на связке sfml+box2d можно писать игры
0
4176 / 2282 / 387
Регистрация: 05.10.2013
Сообщений: 6,385
Записей в блоге: 177
27.06.2020, 01:08 31
Цитата Сообщение от alecss131 Посмотреть сообщение
но только пришлость внести правки в код из ролика. в userdata приведение к (void *) строки, а в setLinearVelocity требовался еще один bool параметр.
Я специально не стал обращать внимания автора темы на эти изменения, чтобы проверить будет ли он пробовать делать по ролику и я готов был подсказать ему, что, например, нужно так написать:
C++ (Qt)
1
body->SetUserData(const_cast<char *>("box"));
Цитата Сообщение от alecss131 Посмотреть сообщение
а что такого в этом qt? ведь по сути на связке sfml+box2d можно писать игры
Я предвидел эту претензию и поэтому у меня в голове уже был ответ до того, как я стал предлагать Qt. Начнём с того, что Qt и QtCreator - это разные вещи. QtCreator - это такая же IDE, как Code::Box, Eclipse, NetBeans и т.д. Можно сказать, что я предлагал QtCreator, как среду разработку, как альтернативу Code::Box. В этом плане, если бы автор темы мне возразил и написал, что он не хочет тратить лишних полтора ГБайта, что он не хочет писать GUI-приложения на C++, и вообще какие-либо виды приложения кроме игр, а хочет писать только игры и зарабатывать только играми, на что я бы ему ответил, что можете поставьте IDE QtCreator отдельно, а не вместе с фреймворком Qt. К примеру, я кроме изучения игр, ещё пишу другие типы приложений на Qt C++. В Qt есть очень многое, почти всё что нужно, как в .NET или в Java для разработки любых типов приложений, что не хватает можно подключить в виде C++ библиотек. Я уверен, что на сегодня Qt - это лучший выбор для C++ программиста. Я даже изучаю Qt как площадку для игр (QPainter, QtOpenGL), а точнее, через простые игры изучаю Qt, а так же SFML и его интеграцию с Qt. В SFML можно подтягивать модули из Qt. Выше я привёл пример, как можно читать изображения с помощью Qt из ресурсов, но можно и с помощью обычного стандартного C++ загрузить файлы изображений. Я вижу большую перспективу в помощи от Qt в играх на C++, а так же использование Qt для написания разного рода приложений на Qt C++. Но повторюсь, что в данной теме я подстраховался и предложил IDE QtCreator, как альтернативу Code::Box, с приятным бонусом от Qt, но если Qt по каким-то причинам не устраивает, то можно поставить QtCreator отдельно. Это удобная кроссплатформенная среда и занимает она намного меньше места, чем например, Visual Studio. Тем более, что VS есть для Windows и Mac, но если человек решит перейти на Linux, то VS нет для Linux, поэтому ему придётся осваивать другую IDE. Меня полностью устраивает и IDE QtCreator и фреймворк Qt для программирования на C++. Всё равно, когда-нибудь автор темы решит начать писать кроссплатфоменные GUI-приложения на C++, если не перейдёт на другой язык. Судя по темам он выбрал Unity и C#, но лично мне интересно так же осваивать и Qt C++ вместе с SFML + OpenGL и т.д.
0
Модератор
1425 / 425 / 140
Регистрация: 11.08.2017
Сообщений: 1,445
27.06.2020, 09:28 32
8Observer8, это была не притензия, а просто вопроос ради интереса, я в плюсах не разбираюсь и не понимаю зачем использовать несколько вещей с похожим функционалом. а если про opengl говорить то не вижу смысла вообще в чем либо кроме необходимых библиотек (glad/galogen, glfw, stb, glm и в этом духе).
повозился я вчера с движком bullet, с трудом смог собрать lib файлы (либо найти) пришлось в студии открывать не sln а cmake файл проекта и руками static библиотеки собирать, но вот в проекте они требуют флагов mt mtd а с md mdd не работают как бы я их не собирал. и судя по hello world примеру он не сильно отличается от box2d по принципу использования. хоть мне привычней джава но похоже придется пересесть на плюсы (порт в пакете lwjgl странный и не полностью повторяет а гайдов/примеров нету). хотя и так уже больше чем ожидал пишу на плюсах))
а автор да, похоже решил юнити выбрать, думаю больше изза графического редактора проекта, а то на этих вариантах ничего не увидеть без запуска проекта, а так же нету проблем со сборкой и подключением библиотек. кстати все чаще замечаю что чаще попадаются игры на этом движке использующе il2cpp
0
4176 / 2282 / 387
Регистрация: 05.10.2013
Сообщений: 6,385
Записей в блоге: 177
27.06.2020, 13:00 33
Цитата Сообщение от alecss131 Посмотреть сообщение
я в плюсах не разбираюсь и не понимаю зачем использовать несколько вещей с похожим функционалом.
Серьёзно говоря, я вообще не вижу смысла изучать написание игр на SFML/Box2D (кроме как хобби и самообразования), потому что очень сложно найти заказы и вакансии по этим технологиям. Если погуглить вакансии в более или менее крупном городе, то по SFML вряд ли вы найдёте что-то. А вот если погуглить Unity, то таких контор полно. Так же полно HTML5 игр для мобильных, что я тоже изучаю, так как браузерные игры популярны, а особенно меня привлекает написание сетевых игр на вебсокетах - для серверов на вебсокетах есть бесплатный хостинг Heroku, где можно тренироваться и тестировать свои игры на пользователях, добавляя так же базу данных SQLite для тренировки в SQL. Unity специализируется в основном на 2D мобильных играх. По крайней мере, 2 конторы в Саратове пишут мобильные 2D-игры на Unity. У них весят вакансии. Не сложно к ним устроиться. Я пробовал, но ушёл, потому что воля и свободна ценнее, я только за фриланс, как бы тяжело иногда не было. Не мало заказов по Unity на Upwork и Freelancer.com Я Unity изучаю из-за того, что достаточно много заказов на зарубежных фриланс ресурсах. Я думаю, что английский проще и интереснее изучать, когда это изучение связано с зарабатыванием денег - такое изучение больше мотивирует и доставляет больше радости. Но с другой стороны, лично я скачал несколько книг по SFML. SFML помогает изучать создание игр через код. В Unity очень многое уже реализовано в виде встроенных настроек, редактора для создания шейдеров без кода, настройка спрайтовых анимаций в редакторе и многое другое. Для дизайнеров это здорово, но я собираюсь также изучать SFML и Unity. Одно другому не мешает, а наоборот - помогает.

Вряд ли программист C++ сразу начнёт зарабатывать себе на хлеб с помощью игр. В этом плане Qt предоставляет широкой диапазон разработки приложений, начиная от GUI и заканчивая поддержкой баз данных и TCP-сокетов. Qt является наиболее распространнённым фреймворком для GUI C++. Можно изучать SFML, добавляя что-то нужное из Qt и тем самым дополнительно изучать Qt. Например, можно придумать игру, где нужна база данных. К примеру, для хранения рекордов игры. В Qt поддержка базы данных идёт прямо из коробки. Пример, как создать и открыть базу данных:

C++ (Qt)
1
2
3
4
5
6
7
8
    QSqlDatabase db;
    db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName(":/db.sqlite");
 
    if (!db.open())
    {
        qDebug() << "problem opening database";
    }
На Qt можно сделать нормальное GUI для игры с помощью QML. Да и вообще, Qt никак не мешает использовать SFML, а наоборот помогает, добавляя, например, встроенную поддержку работы с XML, чтобы, например, загружать уровни. Можно редактор карты сделать, используя стандартный GUI. Для самой игры можно сделать временный GUI. Если это учебная игра, то без разницы какой там GUI, главное, что он есть, и есть возможность потренироваться с GUI: выпадающие списки и радиокнопки. На C++ не так уж и много таких фреймворков как Qt. Я бы даже сказал, что это единственный феймворк для Qt такого уровня. На сегодняшний день Qt лучший. Если человек - это C++ программист и не только игр, но и GUI и других видов приложений, то не надо упускать возможностей его изучать в ежедневной практике.

Цитата Сообщение от alecss131 Посмотреть сообщение
а если про opengl говорить то не вижу смысла вообще в чем либо кроме необходимых библиотек (glad/galogen, glfw, stb, glm и в этом духе).
Я уже выше написал, почему имеет смысл изучать Qt. Добавлю, что вакансий в городах и заказов по Qt больше в плане неигровых приложений, чем на других фреймворках на С++. Отдельно 3D графика нигде не используется, нужно сочетать её с GUI. Если есть Qt, то зачем писать своё GUI с нуля на OpenGL или подключать какие-то устаревшие и заброшенные библиотеки для GUI. Сложно угадать, что потребует заказчик на чистом OpenGL, какой стек библиотек, а их море для OpenGL, проще переубедить его делать на Qt, если он не зашоренный, а адекватный, то это можно сделать. А я не вижу смысла подключать всю эту груду библиотек, когда в Qt абсолютно всё это есть прямо из коробки. Плюс ещё можно делать неигровые 3D приложения, где на одном окне можно сочетать 3D графику и стандартный GUI, а ещё работу с XML, SQL и т.д. Мы имеет фреймворк Qt в котором есть если не всё, то очень многое и в нём гораздо больше потенциала и нет ущерба ни в чём. Очень много чего можно перечислить. Например, сборка нативного приложения под Android и iOS из Qt. Если не нужна OpenGL графика, то на Qt и там много всего можно писать. Получаем очень универсальный фреймворк. Мы находимся в одной экосистеме Qt, что положительно сказывается на производительности С++ программиста.

В Qt для OpenGL есть много облегчающих штук. Например, шейдеры и текстуры можно добавить в ресурсы, чтобы никто не мог просто так заменить текстуры или случайно/специально испортить шейдеры. Ещё можно в одну строчку создать программу, подключить шейдер, слинковать и проверить её. Если ошибка, то выведется сообщение в консоль отладки:

C++ (Qt)
1
2
3
4
    if (!m_program.addShaderFromSourceFile(QOpenGLShader::Vertex, ":/Data/Shaders/vShader.glsl"))
    {
        close();
    }
0
4176 / 2282 / 387
Регистрация: 05.10.2013
Сообщений: 6,385
Записей в блоге: 177
27.06.2020, 13:49 34
Если сравнить, сколько занимает C++ приложение на OpenGL, например, с созданием окна на GLFW, то можно обнаружить, что на Qt даже приложение с рисованием одного треугольника будет весить чуть больше 30 МБайт. Меня такая ситуация нисколько не смущает. Сейчас подавляющее большинство пользователей этого размера не заметит, даже не обратит внимания. Сжимается такой архив до 9 МБайт, что отлично вписывается в прикрепления CyberForum, который позволяет прикреплять до 25 МБайт. К слову сказать, сборки на Unity весят от 19 МБайт - в крайнем случае, сборку приложения в релиз можно развить на несколько архивов.

Рисование треугольника на OpenGL 3.3 собранное в релиз на Qt:
Название: ColoredTriangleQtOpenGL33Cpp_ListOfFiles.png
Просмотров: 29

Размер: 5.0 Кб

Исходники


main.cpp

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#ifdef _WIN32
#include <windows.h>
extern "C" __declspec(dllexport) DWORD NvOptimusEnablement = 0x00000001;
extern "C" __declspec(dllexport) DWORD AmdPowerXpressRequestHighPerformance = 0x00000001;
#endif
 
#include "widget.h"
 
#include <QApplication>
#include <QGLFormat>
 
int main(int argc, char *argv[])
{
    QCoreApplication::setAttribute(Qt::AA_UseDesktopOpenGL);
    QApplication a(argc, argv);
 
    Widget w;
    w.show();
    return a.exec();
}


widget.h

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#ifndef WIDGET_H
#define WIDGET_H
 
#include <QOpenGLWidget>
#include <QOpenGLShaderProgram>
#include <QOpenGLBuffer>
 
class Widget : public QOpenGLWidget
{
    Q_OBJECT
 
public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
 
protected:
    void initializeGL() override;
    void paintGL() override;
    void resizeGL(int w, int h) override;
 
private:
    void loadShaders();
 
    QOpenGLShaderProgram m_program;
    QOpenGLBuffer m_positionBuffer;
    QOpenGLBuffer m_colorBuffer;
};
#endif // WIDGET_H


widget.cpp

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#include "widget.h"
#include <QDebug>
 
Widget::Widget(QWidget *parent)
    : QOpenGLWidget(parent)
{
}
 
Widget::~Widget()
{
}
 
void Widget::initializeGL()
{
    glClearColor(0.1f, 0.2f, 0.3f, 1.0f);
 
    loadShaders();
 
//    qDebug() << (const char*)glGetString(GL_VERSION);
 
    float positions[] = {
        0.0f, 1.0f, 0.0f,
        -1.0, 0.0f, 0.0f,
        1.0, 0.0f, 0.0f
    };
 
    float colors[] = {
        1.0f, 0.0f, 0.0f,
        0.0f, 1.0f, 0.0f,
        0.0f, 0.0f, 1.0f
    };
 
    m_positionBuffer.create();
    m_positionBuffer.bind();
    m_positionBuffer.allocate(positions, sizeof(positions));
//    m_positionBuffer.release();
 
    m_colorBuffer.create();
    m_colorBuffer.bind();
    m_colorBuffer.allocate(colors, sizeof(colors));
//    m_colorBuffer.release();
 
    m_program.bind();
 
    m_positionBuffer.bind();
    int aPositionLoc = m_program.attributeLocation("aPosition");
    m_program.enableAttributeArray(aPositionLoc);
    m_program.setAttributeBuffer(aPositionLoc, GL_FLOAT, 0, 3, 0);
 
    m_colorBuffer.bind();
    int aColorLoc = m_program.attributeLocation("aColor");
    m_program.enableAttributeArray(aColorLoc);
    m_program.setAttributeBuffer(aColorLoc, GL_FLOAT, 0, 3, 0);
}
 
void Widget::paintGL()
{
    glClear(GL_COLOR_BUFFER_BIT);
    glDrawArrays(GL_TRIANGLES, 0, 3);
}
 
void Widget::resizeGL(int w, int h)
{
    glViewport(0, 0, w, h);
}
 
void Widget::loadShaders()
{
    if (!m_program.addShaderFromSourceFile(QOpenGLShader::Vertex, ":/Data/Shaders/vShader.glsl"))
    {
        close();
    }
 
    if (!m_program.addShaderFromSourceFile(QOpenGLShader::Fragment, ":/Data/Shaders/fShader.glsl"))
    {
        close();
    }
 
    if (!m_program.link())
    {
        close();
    }
}


vShader.glsl

Код
#version 330 core

in vec3 aPosition;
in vec3 aColor;

out vec3 vColor;

void main()
{
    gl_Position = vec4(aPosition, 1.0);
    vColor = aColor;
}


fShader.glsl

Код
#version 330 core

in vec3 vColor;

out vec4 fragColor;

void main()
{
    fragColor = vec4(vColor, 1.0);
}


ColoredTriangleQtOpenGL33Cpp.pro
Код
QT       += core gui opengl

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += c++11

LIBS += -lopengl32

# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

SOURCES += \
    main.cpp \
    widget.cpp

HEADERS += \
    widget.h

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

RESOURCES += \
    shaders.qrc



Вполне себе вариант для игр с простой графикой на OpenGL + Qt, либо для неигровых 3D приложений, где сочетаются GUI + OpenGL. Всё в одной экосистеме. Много чего ставить не надо. Всё что нужно есть в Qt.
0
Lestr
27.06.2020, 14:51
  #35

Не по теме:

Цитата Сообщение от 8Observer8 Посмотреть сообщение
Записал гифку
А почему такая маленькая?

0
4176 / 2282 / 387
Регистрация: 05.10.2013
Сообщений: 6,385
Записей в блоге: 177
27.06.2020, 15:11 36
Цитата Сообщение от Lestr Посмотреть сообщение
А почему такая маленькая?
Не хотел тратить время на изменения размеров игровых объектов и коллайдеров.
0
Угадываю функции...
2 / 2 / 0
Регистрация: 18.11.2019
Сообщений: 77
27.06.2020, 16:47  [ТС] 37
Цитата Сообщение от 8Observer8 Посмотреть сообщение
Всё равно, когда-нибудь автор темы решит начать писать кроссплатфоменные GUI-приложения на C++, если не перейдёт на другой язык. Судя по темам он выбрал Unity и C#
Я ещё ничего не выбрал) Занимаюсь программированием на C++ не так давно, и не очень понимаю, с какими библиотеками определённо нужно уметь работать.
QtCreator, кстати мне понравился. Удобный и приятный глазу интерфейс, при чём весит она намного меньше той же VS.
1
4176 / 2282 / 387
Регистрация: 05.10.2013
Сообщений: 6,385
Записей в блоге: 177
27.06.2020, 17:38 38
Цитата Сообщение от MiKITA17 Посмотреть сообщение
QtCreator, кстати мне понравился. Удобный и приятный глазу интерфейс, при чём весит она намного меньше той же VS.
Мне тоже очень понравилась эта IDE. Подсветка кода мне понравилась. Приятно набирать код. Удобно сделано подключение библиотек. Единственно, что в Visual Studio было получше - это автоформатирование кода. Например, в QtCreator отступы внутри скобок не форматируются по нажатию Ctrl+I, но это мелочь.

Мне здесь напомнили про Bullet. Это физический движок для 3D физики. Я решил подключить Bullet к QtCreator и запустить пример "Hello, World" из официального репозитория: https://github.com/bulletphysi... oWorld.cpp Рано или поздно всё равно нужно изучать 3D физику, это точно пригодится и это интересно должно быть.

Bullet я собрал через CMake GUI, отключив все галочки, кроме Bulllet3. Собралось нормально с помощью MinGW.

Я создал пустой проект в QtCreator: "File" > "New File or Project..." > "Other Project" > "Empty qmake Project". Это проект на чистом C++, без использоания фреймворка Qt.

Создал файл main.cpp с содержимым из официального репозитория: https://github.com/bulletphysi... oWorld.cpp

main.cpp

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
///-----includes_start-----
#include "btBulletDynamicsCommon.h"
#include <stdio.h>
 
/// This is a Hello World program for running a basic Bullet physics simulation
 
int main(int argc, char** argv)
{
    ///-----includes_end-----
 
    int i;
    ///-----initialization_start-----
 
    ///collision configuration contains default setup for memory, collision setup. Advanced users can create their own configuration.
    btDefaultCollisionConfiguration* collisionConfiguration = new btDefaultCollisionConfiguration();
 
    ///use the default collision dispatcher. For parallel processing you can use a diffent dispatcher (see Extras/BulletMultiThreaded)
    btCollisionDispatcher* dispatcher = new btCollisionDispatcher(collisionConfiguration);
 
    ///btDbvtBroadphase is a good general purpose broadphase. You can also try out btAxis3Sweep.
    btBroadphaseInterface* overlappingPairCache = new btDbvtBroadphase();
 
    ///the default constraint solver. For parallel processing you can use a different solver (see Extras/BulletMultiThreaded)
    btSequentialImpulseConstraintSolver* solver = new btSequentialImpulseConstraintSolver;
 
    btDiscreteDynamicsWorld* dynamicsWorld = new btDiscreteDynamicsWorld(dispatcher, overlappingPairCache, solver, collisionConfiguration);
 
    dynamicsWorld->setGravity(btVector3(0, -10, 0));
 
    ///-----initialization_end-----
 
    //keep track of the shapes, we release memory at exit.
    //make sure to re-use collision shapes among rigid bodies whenever possible!
    btAlignedObjectArray<btCollisionShape*> collisionShapes;
 
    ///create a few basic rigid bodies
 
    //the ground is a cube of side 100 at position y = -56.
    //the sphere will hit it at y = -6, with center at -5
    {
        btCollisionShape* groundShape = new btBoxShape(btVector3(btScalar(50.), btScalar(50.), btScalar(50.)));
 
        collisionShapes.push_back(groundShape);
 
        btTransform groundTransform;
        groundTransform.setIdentity();
        groundTransform.setOrigin(btVector3(0, -56, 0));
 
        btScalar mass(0.);
 
        //rigidbody is dynamic if and only if mass is non zero, otherwise static
        bool isDynamic = (mass != 0.f);
 
        btVector3 localInertia(0, 0, 0);
        if (isDynamic)
            groundShape->calculateLocalInertia(mass, localInertia);
 
        //using motionstate is optional, it provides interpolation capabilities, and only synchronizes 'active' objects
        btDefaultMotionState* myMotionState = new btDefaultMotionState(groundTransform);
        btRigidBody::btRigidBodyConstructionInfo rbInfo(mass, myMotionState, groundShape, localInertia);
        btRigidBody* body = new btRigidBody(rbInfo);
 
        //add the body to the dynamics world
        dynamicsWorld->addRigidBody(body);
    }
 
    {
        //create a dynamic rigidbody
 
        //btCollisionShape* colShape = new btBoxShape(btVector3(1,1,1));
        btCollisionShape* colShape = new btSphereShape(btScalar(1.));
        collisionShapes.push_back(colShape);
 
        /// Create Dynamic Objects
        btTransform startTransform;
        startTransform.setIdentity();
 
        btScalar mass(1.f);
 
        //rigidbody is dynamic if and only if mass is non zero, otherwise static
        bool isDynamic = (mass != 0.f);
 
        btVector3 localInertia(0, 0, 0);
        if (isDynamic)
            colShape->calculateLocalInertia(mass, localInertia);
 
        startTransform.setOrigin(btVector3(2, 10, 0));
 
        //using motionstate is recommended, it provides interpolation capabilities, and only synchronizes 'active' objects
        btDefaultMotionState* myMotionState = new btDefaultMotionState(startTransform);
        btRigidBody::btRigidBodyConstructionInfo rbInfo(mass, myMotionState, colShape, localInertia);
        btRigidBody* body = new btRigidBody(rbInfo);
 
        dynamicsWorld->addRigidBody(body);
    }
 
    /// Do some simulation
 
    ///-----stepsimulation_start-----
    for (i = 0; i < 150; i++)
    {
        dynamicsWorld->stepSimulation(1.f / 60.f, 10);
 
        //print positions of all objects
        for (int j = dynamicsWorld->getNumCollisionObjects() - 1; j >= 0; j--)
        {
            btCollisionObject* obj = dynamicsWorld->getCollisionObjectArray()[j];
            btRigidBody* body = btRigidBody::upcast(obj);
            btTransform trans;
            if (body && body->getMotionState())
            {
                body->getMotionState()->getWorldTransform(trans);
            }
            else
            {
                trans = obj->getWorldTransform();
            }
            printf("world pos object %d = %f,%f,%f\n", j, float(trans.getOrigin().getX()), float(trans.getOrigin().getY()), float(trans.getOrigin().getZ()));
        }
    }
 
    ///-----stepsimulation_end-----
 
    //cleanup in the reverse order of creation/initialization
 
    ///-----cleanup_start-----
 
    //remove the rigidbodies from the dynamics world and delete them
    for (i = dynamicsWorld->getNumCollisionObjects() - 1; i >= 0; i--)
    {
        btCollisionObject* obj = dynamicsWorld->getCollisionObjectArray()[i];
        btRigidBody* body = btRigidBody::upcast(obj);
        if (body && body->getMotionState())
        {
            delete body->getMotionState();
        }
        dynamicsWorld->removeCollisionObject(obj);
        delete obj;
    }
 
    //delete collision shapes
    for (int j = 0; j < collisionShapes.size(); j++)
    {
        btCollisionShape* shape = collisionShapes[j];
        collisionShapes[j] = 0;
        delete shape;
    }
 
    //delete dynamics world
    delete dynamicsWorld;
 
    //delete solver
    delete solver;
 
    //delete broadphase
    delete overlappingPairCache;
 
    //delete dispatcher
    delete dispatcher;
 
    delete collisionConfiguration;
 
    //next line is optional: it will be cleared by the destructor when the array goes out of scope
    collisionShapes.clear();
}


Подключение Bullet к среде QtCreator в файле .pro:

INCLUDEPATH += "E:\Libs\Bullet3-2.89\include"

LIBS += -L"E:\Libs\Bullet3-2.89\lib"
LIBS += -lBulletDynamics -lBulletCollision -lLinearMath

SOURCES += \
main.cpp
Попробуйте у себя собрать Bullet, подключить к среде QtCreator и запустить. В консоль будут выведены координаты двух падающих объектов:

world pos object 1 = 2.000000,10.000000,0.000000
world pos object 0 = 0.000000,-56.000000,0.000000
world pos object 1 = 2.000000,9.997222,0.000000
world pos object 0 = 0.000000,-56.000000,0.000000
world pos object 1 = 2.000000,9.991667,0.000000
world pos object 0 = 0.000000,-56.000000,0.000000
world pos object 1 = 2.000000,9.983334,0.000000
world pos object 0 = 0.000000,-56.000000,0.000000
world pos object 1 = 2.000000,9.972222,0.000000
world pos object 0 = 0.000000,-56.000000,0.000000
world pos object 1 = 2.000000,9.958333,0.000000
world pos object 0 = 0.000000,-56.000000,0.000000
world pos object 1 = 2.000000,9.941667,0.000000
world pos object 0 = 0.000000,-56.000000,0.000000
world pos object 1 = 2.000000,9.922222,0.000000
world pos object 0 = 0.000000,-56.000000,0.000000
world pos object 1 = 2.000000,9.900000,0.000000
world pos object 0 = 0.000000,-56.000000,0.000000
world pos object 1 = 2.000000,9.875000,0.000000
world pos object 0 = 0.000000,-56.000000,0.000000
world pos object 1 = 2.000000,9.847222,0.000000
world pos object 0 = 0.000000,-56.000000,0.000000
...
Добавлено через 15 минут
Цитата Сообщение от MiKITA17 Посмотреть сообщение
с какими библиотеками определённо нужно уметь работать.
Этих библиотек такое огромное множество. Даже у SFML есть прямой конкурент - это SDL. Эти библиотеки имею одинаковую функциональность. Например, и в SFML и в SDL реализованы спрайтовые анимации. Но SFML - это ООП и работает только на C++, а SDL - это сишная библиотека, то есть можно использовать на языке Си и в SDL нет ООП. Определённо на C++ нужно изучать написание игр на SFML, это удобнее, чем SDL, но нужно, конечно, писать именно игры. Я сам пока ни одной играбельной демки не написал на SFML. Я понимаю, что нужно совсем с простого начинать: крестики-нолики на одном компьютере, дальше, что-то посложнее из списка на канале: https://www.youtube.com/user/FamTrinli/videos Он выложил исходники 16 игр на SFML. Я считаю, что нужно научиться повторять эти демки из головы, а дальше мозг будет подсказывать, что можно в играх изменять, ввести свои фишки. Очень много принципов из игр можно переносить из SFML на другие движки. Не надо бояться, что вы изучаете SFML, тратите время, а потом не найдёте работу. Я уверен, что если двигаться уверенно, не терять время просто так, то навыки и знания из SFML пригодятся. Но при этом нужно изучать Unity (либо Godot, либо Unreal). Лично мне больше нравится Unity, потому что он наиболее популярен, чем Godot, и наименее требовательный, чем Unreal. Если бы у меня был бы мощный ноутбук и достаточно места на жёском, то я бы поставил и дополнительно изучал бы Unreal.
0
Модератор
1425 / 425 / 140
Регистрация: 11.08.2017
Сообщений: 1,445
27.06.2020, 18:05 39
8Observer8, я bullet собирал в студии и с горем пополам, пришлось открывать как cmake проект, в итоге удалось собрать только вариант работающий только с /mt /mtd, для чего пришлсь и glfw с этими ключами пересобирать
но до сих пор вылазят предупреждение про pbd хотя они есть (как их получал другая история))
но зато на основе этого helloworld написал прыгающий кубик)) графику рисую сам на чистом opengl 4.6, пока с простым освещением Блинн-Фонга и одним точечным источником света без затухания. Зато работает) Только в примере сфера после всего деактивируется и не прыгает (точнее не реагирует на setLinearVelocity), а к тушкам не применены флаги, а по хорошему стоит, как минимум для статика и кинематика (для динамик нету).
По первому впечатлению движок очень похож на box2d, и по сути изучив бокс можно на пулю без особых проблем перейти. Создаешь мир с гравитацией, в 3д поболее настроек и параметров надо, но пойдут и дефолтные. Для объектов создаешь shape body положение в мире, только опять же больше проомежуточных шагов, наприер localInertity у динамических объектов. Попробуй превратить прыгающий кубик в стартовую карту от анреала для первого лица но без оружия.
Unreal вечит не много, в пределах 16гб, а качать не более 8, это со стартовыми ассетами, но только под винду и без символов отладки. Он вроде требует студию, с другими не знаю. А то что требовательный это да, помню 4.20 бегал куда быстрее чем 4.25 и не все полезные плагины обновляются на новые версии. Но на блюпринтах и без плагинов не из магазина можно и без компилятора собирать. В последних версиях вырезали сборку в html, можно добавить но надо собирать движок самому из комьюнити версии.
Юнити не только 2д и мобильные. Дофига компьютерных игрв 3д на юнити и как уже говорил все чаще с использованием il2cpp, то есть с компиляцией шарпа в нативный си код. Порой встречаются неплохие проекты.
Только для геймдева учить движки и программирование не достаточно, я бы сказал что это треть максимум (или половина если свой движок), для 2д игр надо уметь рисовать либо находить картинки, а для 3д моделить или находить и уметь соединять с анимацией (либо прикручивать с нуля).
Для меня создание игр (а точнее попытки создания) это хобби и мне куда интереснее чистый opengl/vulkan нежели нечто готовое по типу sfml/ogre. Надо будет разобраться в тенях.
0
Угадываю функции...
2 / 2 / 0
Регистрация: 18.11.2019
Сообщений: 77
27.06.2020, 18:44  [ТС] 40
Цитата Сообщение от alecss131 Посмотреть сообщение
для 2д игр надо уметь рисовать либо находить картинки
Ну никогда не поздно найти художника-единомысленника)
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.06.2020, 18:44

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Какой мультиплеер лучше выбрать?
Который мультиплеер лучше выбрать? Где почитать о нем? Такой что не надо вводить IP адресов а...

Как лучше залить текстуру в массив? Какой формат текстуры лучше использовать?
Как лучше залить текстуру в массив? Какой формат текстуры лучше использовать?

3D движок вручную, какие инструменты выбрать?
Всем добрый день, интересует вопрос по поводу того, какие библиотеки использовать для...

Выбрать движок? [Unity3D, XNA, OGRE, Wave, Delta, Axiom, Mono.]
Собственно сабж. Сам не первый год в геймдеве, но вот желание делать новый проект - и опять не...

Какой игровой движок будет быстро работать на такой конфигурации компьютера?
Подскажите, какой игровой движок из популярных будет быстро работать на такой конфигурации: AMD...

Какой движок лучше выбрать
Привет Хочу сделать сайт-визитку по технике. Вопрос какой лучше движок выбрать вордпресс или юкоз...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.