Статья для начинающих пользователей движка Ogre 3D. В этом примере я опишу пример класса игрового объекта, который, что либо делает на сцене.
Для начала создайте пустой консольный проект в Mizrosoft Visual C++ Express.
Добавьте файл main.cpp и напишите функцию входа в приложение.
У нас готова программа которая ничего не делает. Теперь пропишите пути к Огру. В моем случае, я залез в свойства проеката, там настроил каталоги заголовочных файлов D:\OGRE\include; D:\OGRE\boost_1_42. Потом выставил каталоги библиотек D:\OGRE\lib\debug; D:\OGRE\boost_1_42\lib
Теперь нужно включить файлы Огра. в начале функции main напишем:
#include <OGRE\ExampleApplication.h>
#pragma comment(lib,"OgreMain_d.lib")
#pragma comment(lib,"OIS_d.lib")
Это была настройка проекта.
И последнее, что нужно сделать это создать класс приложения огра.
class Game : public ExampleApplication
{
public:
void createScene()
{
}
}
теперь запустим класс Огра в методе main
int main()
{Game game; //новые строки
game.go();
return 0;
}
Можете скомпилировать проект и положить exe файл в каталог bin\debug в каталоге с Ogre3D, я сделал проще, я в настройках отладки установил рабочий каталог D:\OGRE\bin\debug. Будет просто черное окно. Теперь взгляните на класс игрового объекта:
class CBeast : public Ogre::FrameListener
{
public:
Ogre::Entity* body;
Ogre::SceneNode* node;
Ogre::AnimationState* currentAnimation;
CBeast(Ogre::SceneManager *mSceneMgr) : Ogre::FrameListener()
{
body = mSceneMgr->createEntity("beast.mesh");
body->setCastShadows(true);
node = mSceneMgr->getRootSceneNode()->createChildSceneNode();
node->attachObject(body);
node->pitch(Ogre::Degree(90));
Ogre::Root::getSingletonPtr()->addFrameListener(this);
node->setPosition(0,80,0);
currentAnimation = body->getAnimationState("run");
currentAnimation->setEnabled(true);
currentAnimation->setLoop(true);
}
bool frameStarted(const Ogre::FrameEvent &evt)
{
currentAnimation->addTime(evt.timeSinceLastFrame);
return true;
}
};
Пояснения.
Я создал класс унаследованный от Ogre::FrameListener, я это сделал затем, что бы объект мог что то делать, а не просто тупо существовать на сцене. body, node, currentAnimation - это вспомогательные переменные, которые будут использоваться внутри класса. Конструктор в качестве параметра принимает менеджер сцены на котором мы хотим расположить игровой объект. Далее в конструкторе я создаю и настраиваю объект. И вот самое интересное - это функция frameStarted(). В этой функции и нужно описывать поведение объекта. В моем случае я сделал играть анимацию.
Теперь чтобы создать объект, нужно в main классе написать следующее:
CBeast* beast = new CBeast(mSceneMgr);
Теперь на сцене появится зверь, который будет бегать =) Ура. Если нам нужен еще один бегающий зверь, еще раз пишем эту строку
CBeast* beast2 = new CBeast(mSceneMgr);
Далее создаем свет тени и т.д. компилируем и наслаждаемся.
Полный код
#include <OGRE\ExampleApplication.h>
#pragma comment(lib,"OgreMain_d.lib")
#pragma comment(lib,"OIS_d.lib")
class CBeast : public Ogre::FrameListener
{
public:
Ogre::Entity* body;
Ogre::SceneNode* node;
Ogre::AnimationState* currentAnimation;
CBeast(Ogre::SceneManager *mSceneMgr) : Ogre::FrameListener()
{
body = mSceneMgr->createEntity("beast.mesh");
body->setCastShadows(true);
node = mSceneMgr->getRootSceneNode()->createChildSceneNode();
node->attachObject(body);
node->pitch(Ogre::Degree(90));
Ogre::Root::getSingletonPtr()->addFrameListener(this);
node->setPosition(0,80,0);
currentAnimation = body->getAnimationState("run");
currentAnimation->setEnabled(true);
currentAnimation->setLoop(true);
}
bool frameStarted(const Ogre::FrameEvent &evt)
{
currentAnimation->addTime(evt.timeSinceLastFrame);
return true;
}
};
class Game : public ExampleApplication
{
public:
void createScene()
{
Ogre::Entity* ground1_ent = mSceneMgr->createEntity("ground1.mesh");
Ogre::SceneNode* ground1 = mSceneMgr->getRootSceneNode()->createChildSceneNode();
ground1->attachObject(ground1_ent);
ground1_ent->setCastShadows(false);
CBeast* beast = new CBeast(mSceneMgr);
mSceneMgr->setAmbientLight( ColourValue(0.35, 0.35, 0.35) );
mSceneMgr->setShadowTechnique(SHADOWTYPE_STENCIL_ADDITIVE);
Ogre::Light* mSunLight = mSceneMgr->createLight("Sun");
mSunLight->setType(Light::LT_DIRECTIONAL);
mSunLight->setDiffuseColour(1.0, 1.0, 1.0);
mSunLight->setSpecularColour(1.0, 1.0, 1.0);
mSunLight->setDirection(Vector3(0, -0.5f, 0.5f));
}
};
int main()
{
Game game;
game.go();
return 0;
}
Оригинал статьи:
http://malcdevelop.ru/index.php/ogre...ya-dlya-obekta