forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   FAQ (http://forum.boolean.name/forumdisplay.php?f=157)
-   -   Вариант создания поведения для объекта (http://forum.boolean.name/showthread.php?t=16336)

pozitiffcat 15.02.2012 15:25

Вариант создания поведения для объекта
 
Статья для начинающих пользователей движка Ogre 3D. В этом примере я опишу пример класса игрового объекта, который, что либо делает на сцене.

Для начала создайте пустой консольный проект в Mizrosoft Visual C++ Express.
Добавьте файл main.cpp и напишите функцию входа в приложение.
PHP код:

int main()
{
return 
0;


У нас готова программа которая ничего не делает. Теперь пропишите пути к Огру. В моем случае, я залез в свойства проеката, там настроил каталоги заголовочных файлов D:\OGRE\include; D:\OGRE\boost_1_42. Потом выставил каталоги библиотек D:\OGRE\lib\debug; D:\OGRE\boost_1_42\lib
Теперь нужно включить файлы Огра. в начале функции main напишем:

PHP код:

#include <OGRE\ExampleApplication.h>

#pragma comment(lib,"OgreMain_d.lib")
#pragma comment(lib,"OIS_d.lib") 

Это была настройка проекта.

И последнее, что нужно сделать это создать класс приложения огра.

PHP код:

class Game : public ExampleApplication
{
public:
void createScene()
{
}


теперь запустим класс Огра в методе main



PHP код:

int main()
{
Game game//новые строки
game.go();

return 
0;




Можете скомпилировать проект и положить exe файл в каталог bin\debug в каталоге с Ogre3D, я сделал проще, я в настройках отладки установил рабочий каталог D:\OGRE\bin\debug. Будет просто черное окно. Теперь взгляните на класс игрового объекта:

PHP код:

class CBeast : public Ogre::FrameListener
{
public:
Ogre::Entitybody;
Ogre::SceneNodenode;
Ogre::AnimationStatecurrentAnimation;
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 классе написать следующее:

PHP код:

CBeastbeast = new CBeast(mSceneMgr); 

Теперь на сцене появится зверь, который будет бегать =) Ура. Если нам нужен еще один бегающий зверь, еще раз пишем эту строку

PHP код:

CBeastbeast2 = new CBeast(mSceneMgr); 

Далее создаем свет тени и т.д. компилируем и наслаждаемся.
Полный код
PHP код:

#include <OGRE\ExampleApplication.h>

#pragma comment(lib,"OgreMain_d.lib")
#pragma comment(lib,"OIS_d.lib")

class CBeast : public Ogre::FrameListener
{
public:
Ogre::Entitybody;
Ogre::SceneNodenode;
Ogre::AnimationStatecurrentAnimation;
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::Entityground1_ent mSceneMgr->createEntity("ground1.mesh");
Ogre::SceneNodeground1 mSceneMgr->getRootSceneNode()->createChildSceneNode();
ground1->attachObject(ground1_ent);
ground1_ent->setCastShadows(false);

CBeastbeast = new CBeast(mSceneMgr);

mSceneMgr->setAmbientLightColourValue(0.350.350.35) );
mSceneMgr->setShadowTechnique(SHADOWTYPE_STENCIL_ADDITIVE);
Ogre::LightmSunLight mSceneMgr->createLight("Sun");
mSunLight->setType(Light::LT_DIRECTIONAL);
mSunLight->setDiffuseColour(1.01.01.0);
mSunLight->setSpecularColour(1.01.01.0);
mSunLight->setDirection(Vector3(0, -0.5f0.5f));

}
};


int main()
{
Game game;
game.go();
return 
0;


Оригинал статьи: http://malcdevelop.ru/index.php/ogre...ya-dlya-obekta


Часовой пояс GMT +4, время: 12:23.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot