Создание проекта работающего с Ogre3D, MyGUI, Bullet Physics, OpenAL, FreeALUT, Qt с использованием MinGW, CMake и среды разработки QtCreator под Windows

План статьи:
1. Подготовка дополнительных зависимостей
2. Структурирование папок
3. Создание проекта ядра игры
4. Создания основного проекта игры
5. Заключение

1. Подготовка дополнительных зависимостей

Сборкой зависимостей из исходников мы покончили в предыдущей статье теперь, надо скачать парочку дополнительных бинарников с OpenAL и FreeALUT.
Скачаем бинарники для Windows. Бинарники можно скачать здесь http://connect.creativelabs.com/openal/Downloads/Forms/AllItems.aspx я качал OpenAL 1.1 Core SDK и freealut-1.1.0-bin. После того как скачали, размещаем их по папкам. У меня это папки «D:\Dev\ExternalDependencies\freealut-1.1.0-bin» и «D:\Dev\ExternalDependencies\OpenAL_1.1_SDK». Для корректной сборки требуется скопировать заголовочные файлы OpenAL в директорию «D:\Dev\ExternalDependencies\freealut-1.1.0-bin\include\AL».
На этом всё теперь все зависимости присутствуют.

2. Структурирование папок

В целом структура папок содержащая зависимости выглядит так:

D:\Dev\JustGameProject\ExternalDependencies\
                               ├ OgreDependencies
                               ├ OgreDependencies_build
                               ├ OgreDependencies_install  
                               ├ Ogre              
                               ├ Ogre_build
                               ├ Ogre_install
                               ├ MyGUI
                               ├ MyGUI_build
                               ├ MyGUI_install
                               ├ Bullet
                               ├ Bullet_build
                               ├ Bullet_install
                               ├ freealut-1.1.0-bin
                               └ OpenAL_1.1_SDK

Теперь я создаю папку где будут содержатся исходники игры. Она будет у меня расположена здесь: «D:\Dev\JustGameProject».

Ядро игры:

  • JustGameCore
  • JustGameCore_build
  • JustGameCore_install

Основная часть игры:

  • JustGame
  • JustGame_build
  • JustGame_install

Папка с медиа контентом для игры:

  • JustGameMedia_sources

Общая структура папок с исходниками игры выглядит так:

D:\Dev\JustGameProject\
               ├ JustGameMedia
               ├ JustGameCore
               ├ JustGameCore_build
               ├ JustGameCore_install
               ├ JustGame
               ├ JustGame_build
               └ JustGame_install

3. Создание проекта ядра игры

Ядром игры будет статическая библиотека.
Создание «CMakeLists.txt» для проекта ядра игры:

CMAKE_MINIMUM_REQUIRED(VERSION 2.8)

SET(PROJECT JustGameCore)
PROJECT(${PROJECT})

######################################################################
# Setting source files for this project
######################################################################
SET(HEADERS
./src/MainSystem.h
./src/ISystemsListener.h
./src/Utils.h
./src/GraphicSystem.h
./src/MyMotionState.h
./src/PhysicsDebugDrawer.h
./src/PhysicsSystem.h
./src/InputSystem.h
./src/SoundListener.h
./src/SoundSource.h
./src/SoundSystem.h
./src/ILoadScreen.h
./src/IState.h
./src/StatesSystem.h
./src/Entity.h
./src/IComponent.h
./src/ISystem.h
./src/EntitySystem.h
./src/CountersSystem.h
./src/Counter.h
)
 
SET(SOURCES
./src/MainSystem.cpp
./src/Utils.cpp
./src/GraphicSystem.cpp
./src/MyMotionState.cpp
./src/PhysicsDebugDrawer.cpp
./src/PhysicsSystem.cpp
./src/InputSystem.cpp
./src/SoundListener.cpp
./src/SoundSource.cpp
./src/SoundSystem.cpp
./src/StatesSystem.cpp
./src/Entity.cpp
./src/EntitySystem.cpp
./src/CountersSystem.cpp
./src/Counter.cpp
)

######################################################################
# Setting the include directory of dependencies
######################################################################
SET(OPENAL_SDK_DIR CACHE PATH FORCE)
IF(OPENAL_SDK_DIR STREQUAL "")
MESSAGE(SEND_ERROR "Please set directory where OpenAl sdk")
ENDIF(OPENAL_SDK_DIR STREQUAL "")

SET(FREEALUT_DIR CACHE PATH FORCE)
IF(FREEALUT_DIR STREQUAL "")
MESSAGE(SEND_ERROR "Please set directory where Freealut bin")
ENDIF(FREEALUT_DIR STREQUAL "")

SET(OGRE_INSTALL_DIR CACHE PATH FORCE)
IF(OGRE_INSTALL_DIR STREQUAL "")
MESSAGE(SEND_ERROR "Please set directory where Ogre install")
ENDIF(OGRE_INSTALL_DIR STREQUAL "")

SET(MYGUI_INSTALL_DIR CACHE PATH FORCE)
IF(MYGUI_INSTALL_DIR STREQUAL "")
MESSAGE(SEND_ERROR "Please set directory where MyGUI install")
ENDIF(MYGUI_INSTALL_DIR STREQUAL "")

SET(BULLET_INSTALL_DIR CACHE PATH FORCE)
IF(BULLET_INSTALL_DIR STREQUAL "")
MESSAGE(SEND_ERROR "Please set directory where Bullet install")
ENDIF(BULLET_INSTALL_DIR STREQUAL "")

INCLUDE_DIRECTORIES(
${OPENAL_SDK_DIR}/include
${FREEALUT_DIR}/include
${FREEALUT_DIR}/include/al
${OGRE_INSTALL_DIR}/include
${OGRE_INSTALL_DIR}/include/OIS
${OGRE_INSTALL_DIR}/include/OGRE
${MYGUI_INSTALL_DIR}/include/MYGUI
${BULLET_INSTALL_DIR}/include/bullet
)

######################################################################
# Setting Qt packages
######################################################################
SET(QT_ROOT $ENV{QT_ROOT})
SET(QT_QMAKE_EXECUTABLE ${QT_ROOT}/bin/qmake)
SET(QT_MOC_EXECUTABLE ${QT_ROOT}/bin/moc)
SET(QT_RCC_EXECUTABLE ${QT_ROOT}/bin/rcc)
SET(QT_UIC_EXECUTABLE ${QT_ROOT}/bin/uic)
SET(QT_INCLUDE_DIR ${QT_ROOT}/include)
SET(QT_LIBRARY_DIR ${QT_ROOT}/lib)
SET(QT_QTCORE_LIBRARY ${QT_ROOT}/lib)
FIND_PACKAGE(Qt4 REQUIRED)
INCLUDE(${QT_USE_FILE})
ADD_DEFINITIONS(${QT_DEFINITIONS})

QT4_WRAP_CPP(HEADERS_MOC ${HEADERS})

SET(QT_DONT_USE_QTGUI true)
 
######################################################################
# Setting build options
######################################################################
IF(CMAKE_BUILD_TYPE STREQUAL "")
SET(CMAKE_BUILD_TYPE "Debug")
MESSAGE(STATUS "Setting CMAKE_BUILD_TYPE to Debug")
ENDIF(CMAKE_BUILD_TYPE STREQUAL "")

SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib/${CMAKE_BUILD_TYPE})
SET(CMAKE_DEBUG_POSTFIX "_d")
ADD_LIBRARY(${PROJECT} ${HEADERS} ${SOURCES} ${HEADERS_MOC})

######################################################################
# Setting install rules
######################################################################
INSTALL(
FILES ${HEADERS}
DESTINATION include
)

INSTALL(
TARGETS ${PROJECT}
ARCHIVE DESTINATION lib/Debug
CONFIGURATIONS Debug
)

INSTALL(
TARGETS ${PROJECT}
ARCHIVE DESTINATION lib/Release
CONFIGURATIONS Release
)

4. Создания основного проекта игры

Основной проект будет нам давать исполняемый файл.
Создание «CMakeLists.txt» для основного проекта игры:

CMAKE_MINIMUM_REQUIRED(VERSION 2.8)

SET(PROJECT JustGame)
PROJECT(${PROJECT})
 
######################################################################
# Setting source files for this project
######################################################################
set(HEADERS
./src/creators/ComponentsCreators.h
./src/components/GraphBody.h
./src/components/PhysBody.h
./src/components/SoundBody.h
./src/components/Health.h
./src/components/PlayerControllable.h
./src/components/AIControllable.h
./src/components/CameraTrackable.h
./src/components/Weapon.h
./src/components/Bullet.h
./src/components/PlayerUI.h
./src/systems/Bullets.h
./src/systems/PlayerControl.h
./src/systems/PhysGraphSync.h
./src/systems/PlayerCameraSync.h
./src/systems/AIControl.h
./src/systems/DamageSys.h
./src/systems/PlayerGUISys.h
)

set(SOURCES
./src/main.cpp
./src/creators/ComponentsCreators.cpp
./src/systems/Bullets.cpp
./src/systems/PlayerControl.cpp
./src/systems/PhysGraphSync.cpp
./src/systems/PlayerCameraSync.cpp
./src/systems/AIControl.cpp
./src/systems/DamageSys.cpp
./src/systems/PlayerGUISys.cpp
)

set(CONFIGS
./configs
)

######################################################################
# Setting Qt packages
######################################################################
set(QT_ROOT $ENV{QT_ROOT})
set(QT_QMAKE_EXECUTABLE ${QT_ROOT}/bin/qmake)
set(QT_MOC_EXECUTABLE ${QT_ROOT}/bin/moc)
set(QT_RCC_EXECUTABLE ${QT_ROOT}/bin/rcc)
set(QT_UIC_EXECUTABLE ${QT_ROOT}/bin/uic)
set(QT_INCLUDE_DIR ${QT_ROOT}/include)
set(QT_LIBRARY_DIR ${QT_ROOT}/lib)
set(QT_QTCORE_LIBRARY ${QT_ROOT}/lib)
find_package(Qt4 REQUIRED)
include(${QT_USE_FILE})
ADD_DEFINITIONS(${QT_DEFINITIONS})

qt4_wrap_cpp(HEADERS_MOC ${HEADERS})

set(QT_DONT_USE_QTGUI true)

######################################################################
# Setting the directories of dependencies
######################################################################
set(OPENAL_SDK_DIR CACHE PATH FORCE)
if(OPENAL_SDK_DIR STREQUAL "")
message(SEND_ERROR "Please set directory where OpenAl sdk")
endif(OPENAL_SDK_DIR STREQUAL "")

set(FREEALUT_DIR CACHE PATH FORCE)
if(FREEALUT_DIR STREQUAL "")
message(SEND_ERROR "Please set directory where Freealut bin")
endif(FREEALUT_DIR STREQUAL "")

set(OGRE_INSTALL_DIR CACHE PATH FORCE)
if(OGRE_INSTALL_DIR STREQUAL "")
message(SEND_ERROR "Please set directory where Ogre install")
endif(OGRE_INSTALL_DIR STREQUAL "")

set(MYGUI_INSTALL_DIR CACHE PATH FORCE)
if(MYGUI_INSTALL_DIR STREQUAL "")
message(SEND_ERROR "Please set directory where MyGUI install")
endif(MYGUI_INSTALL_DIR STREQUAL "")

set(BULLET_INSTALL_DIR CACHE PATH FORCE)
if(BULLET_INSTALL_DIR STREQUAL "")
message(SEND_ERROR "Please set directory where Bullet install")
endif(BULLET_INSTALL_DIR STREQUAL "")

set(QT_INSTALL_DIR CACHE PATH FORCE)
if(QT_INSTALL_DIR STREQUAL "")
message(SEND_ERROR "Please set directory where Qt install")
endif(QT_INSTALL_DIR STREQUAL "")

set(JUSTGAMECORE_INSTALL_DIR CACHE PATH FORCE)
if(JUSTGAMECORE_INSTALL_DIR STREQUAL "")
message(SEND_ERROR "Please set directory where JustGameCore install")
endif(JUSTGAMECORE_INSTALL_DIR STREQUAL "")

set(JUSTGAMEMEDIA_DIR CACHE PATH FORCE)
if(JUSTGAMEMEDIA_DIR STREQUAL "")
message(SEND_ERROR "Please set directory where JustGameMedia")
endif(JUSTGAMEMEDIA_DIR STREQUAL "")

######################################################################
# Setting includes of dependencies
######################################################################
include_directories(
${OPENAL_SDK_DIR}/include
${FREEALUT_DIR}/include
${FREEALUT_DIR}/include/al
${OGRE_INSTALL_DIR}/include
${OGRE_INSTALL_DIR}/include/OIS
${OGRE_INSTALL_DIR}/include/OGRE
${MYGUI_INSTALL_DIR}/include/MYGUI
${BULLET_INSTALL_DIR}/include/bullet
${JUSTGAMECORE_INSTALL_DIR}/include
)

######################################################################
# Setting libs of dependencies
######################################################################
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
set(LIBRARIES
${JUSTGAMECORE_INSTALL_DIR}/lib/Debug/libJustGameCore_d.a
${OPENAL_SDK_DIR}/libs/Win32/OpenAL32.lib
${FREEALUT_DIR}/lib/alut.lib
${MYGUI_INSTALL_DIR}/lib/Debug/libMyGUI.OgrePlatform_d.a
${MYGUI_INSTALL_DIR}/lib/Debug/libMyGUIEngine_d.dll.a
${OGRE_INSTALL_DIR}/lib/debug/libOgreMain_d.dll.a
${OGRE_INSTALL_DIR}/lib/debug/libOIS_d.dll.a
${BULLET_INSTALL_DIR}/lib/libBulletSoftBody_Debug.a
${BULLET_INSTALL_DIR}/lib/libBulletDynamics_Debug.a
${BULLET_INSTALL_DIR}/lib/libBulletCollision_Debug.a
${BULLET_INSTALL_DIR}/lib/libLinearMath_Debug.a
)
endif(CMAKE_BUILD_TYPE STREQUAL "Debug")

if(CMAKE_BUILD_TYPE STREQUAL "Release")
set(LIBRARIES
${JUSTGAMECORE_INSTALL_DIR}/lib/Release/libJustGameCore.a
${OPENAL_SDK_DIR}/libs/Win32/OpenAL32.lib
${FREEALUT_DIR}/lib/alut.lib
${MYGUI_INSTALL_DIR}/lib/Release/libMyGUI.OgrePlatform.a
${MYGUI_INSTALL_DIR}/lib/Release/libMyGUIEngine.dll.a
${OGRE_INSTALL_DIR}/lib/release/libOgreMain.dll.a
${OGRE_INSTALL_DIR}/lib/release/libOIS.dll.a
${BULLET_INSTALL_DIR}/lib/libBulletSoftBody.a
${BULLET_INSTALL_DIR}/lib/libBulletDynamics.a
${BULLET_INSTALL_DIR}/lib/libBulletCollision.a
${BULLET_INSTALL_DIR}/lib/libLinearMath.a
)
endif(CMAKE_BUILD_TYPE STREQUAL "Release")

######################################################################
# Setting build options
######################################################################
if(CMAKE_BUILD_TYPE STREQUAL "")
set(CMAKE_BUILD_TYPE "Debug")
message(STATUS "Setting CMAKE_BUILD_TYPE to Debug")
endif(CMAKE_BUILD_TYPE STREQUAL "")

set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin/${CMAKE_BUILD_TYPE})
add_executable(${PROJECT} WIN32 ${HEADERS} ${SOURCES} ${HEADERS_MOC})
target_link_libraries(${PROJECT} ${LIBRARIES} ${QT_LIBRARIES})

######################################################################
# Setting install rules
######################################################################
#all
INSTALL(DIRECTORY ${JUSTGAMEMEDIA_DIR}/
DESTINATION bin/Media
COMPONENT myinstall
PATTERN .git EXCLUDE
)

#Debug
INSTALL(
FILES
${CONFIGS}/debug/Plugins.cfg
${OGRE_INSTALL_DIR}/bin/debug/OgreMain_d.dll
${OGRE_INSTALL_DIR}/bin/debug/RenderSystem_GL_d.dll
${OGRE_INSTALL_DIR}/bin/debug/OIS_d.dll
${OGRE_INSTALL_DIR}/bin/debug/cg.dll
${MYGUI_INSTALL_DIR}/bin/debug/libMyGUIEngine_d.dll
${FREEALUT_DIR}/lib/alut.dll
${QT_INSTALL_DIR}/bin/QtCored4.dll
DESTINATION bin/Debug
CONFIGURATIONS Debug
)

INSTALL(
TARGETS ${PROJECT}
RUNTIME DESTINATION bin/Debug
CONFIGURATIONS Debug
)

#Release
INSTALL(
FILES
${CONFIGS}/release/Plugins.cfg
${OGRE_INSTALL_DIR}/bin/release/OgreMain.dll
${OGRE_INSTALL_DIR}/bin/release/RenderSystem_GL.dll
${OGRE_INSTALL_DIR}/bin/release/OIS.dll
${OGRE_INSTALL_DIR}/bin/release/cg.dll
${MYGUI_INSTALL_DIR}/bin/release/libMyGUIEngine.dll
${FREEALUT_DIR}/lib/alut.dll
${QT_INSTALL_DIR}/bin/QtCore4.dll
DESTINATION bin/Release
CONFIGURATIONS Release
)

INSTALL(
TARGETS ${PROJECT}
RUNTIME DESTINATION bin/Release
CONFIGURATIONS Release
)

5. Заключение

В заключении стоит напомнить, что необходимо собирать оба проекта каждый раз с ключами для Debug

-DCMAKE_BUILD_TYPE=Debug

для Release

-DCMAKE_BUILD_TYPE=Release

Также не забываем модифицировать параметр установки для проекта в КРеаторе, чтобы запускался этап установки.

Ну и по прежнему ваши пожелания, комментарии и поправки только приветствуются=)

Реклама

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s