在Ogre中共有继承基类ExampleApplication.h可以实现很多应用,比如今天根据教程实现的起伏地形,云和雾灯效果。
#include "ExampleApplication.h"
class Example25FrameListener:public Ogre::FrameListener
{
private:
Ogre::SceneNode* _node;
public:
Example25FrameListener(Ogre::SceneNode* node)
{
_node=node;
}
bool frameStarted(const Ogre::FrameEvent &evt)
{
_node->translate(Ogre::Vector3(0.1,0,0)); //用(0.1,0,0)来变化节点node以图产生移动(运动)
return true;
}
Ogre::FrameListener* FrameListener;
public:
Example25FrameListener()
{
FrameListener=NULL;
}
~Example25FrameListener()
{
if(FrameListener)
{delete FrameListener;}
}
};
class TutorialApplication : public ExampleApplication
{
private:
Ogre::SceneNode* _SinbadNode;
protected:
void chooseSceneManager(void) //to choose Scene Manager
{
mSceneMgr=mRoot->createSceneManager(ST_EXTERIOR_CLOSE); //choose "ST_EXTERIOR_CLOSE"type Scene Manager
ResourceGroupManager::getSingleton().initialiseAllResourceGroups();
}
void createScene(void)
{
//adding viewport and fog ,must set before adding a ground
ColourValue fadeColour(0.9,0.7,0.9);
mWindow->getViewport(0)->setBackgroundColour(fadeColour);
mSceneMgr->setFog(FOG_LINEAR,fadeColour,0.001f,10,500);
//adding a ground
/*mSceneMgr->setWorldGeometry("terrain.cfg");*/
//Create a plane
Ogre::Plane plane(Vector3::UNIT_Y,-10);
Ogre::MeshManager::getSingleton().createPlane("plane",ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,
plane,1500,1500,200,200,true,1,5,5,Vector3::UNIT_Z);
Ogre::Entity* ent=mSceneMgr->createEntity("LightPlaneEntity","plane");
mSceneMgr->getRootSceneNode()->createChildSceneNode()->attachObject(ent);
ent->setMaterialName("Examples/Rockwall");
//adding light
Ogre::Light* light=mSceneMgr->createLight("light1");
light->setType(Ogre::Light::LT_DIRECTIONAL);
light->setDirection(Ogre::Vector3(10,0,-10));
//adding entity
Ogre::SceneNode* node=mSceneMgr->createSceneNode("node1");
mSceneMgr->getRootSceneNode()->addChild(node);
Ogre::Entity* Sinbad=mSceneMgr->createEntity("Ninja","ninja.mesh");
_SinbadNode=node->createChildSceneNode("NinjaNode");
_SinbadNode->setScale(0.25f,0.25f,0.25f);
_SinbadNode->setPosition(Ogre::Vector3(400.0f,50.0f,400.0f));
_SinbadNode->attachObject(Sinbad);
_SinbadNode->yaw(Degree(-135));
//adding shadow
mSceneMgr->setShadowTechnique(SHADOWTYPE_STENCIL_MODULATIVE);
//adding plane sky
Plane plane1;
plane1.d=1000;
plane1.normal=Vector3::NEGATIVE_UNIT_Y;
mSceneMgr->setSkyPlane(false,plane1,"Examples/SpaceSkyPlane",1500,75,true,1.5f,150,150);
mSceneMgr->setSkyDome(true,"Examples/CloudySky",5,8,2000,true);
}
//adding a camera
virtual void createCamera(void)
{
mCamera=mSceneMgr->createCamera("MyCamera1");
mCamera->setPosition(550.0f,120.0f,550.0f);
mCamera->lookAt(400.0f,100.0f,400.0f);
mCamera->setNearClipDistance(5);
}
public:
TutorialApplication(){}
~TutorialApplication(){}
};
#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
#define WIN32_LEAN_AND_MEAN
#include "windows.h"
INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine,
INT )
#else
int main(int argc, char **argv)
#endif
{
// Create application object
TutorialApplication app;
try {
app.go();
} catch( Exception& e ) {
#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
MessageBox( NULL, e.getFullDescription().c_str(), "An exception has occured!", MB_OK | MB_ICONERROR | MB_TASKMODAL);
#else
fprintf(stderr, "An exception has occured: %s\n",
e.getFullDescription().c_str());
#endif
}return 0;
}