#include "ExampleApplication.h"
class Example25FrameListener:public Ogre::FrameListener
{
public:
Example25FrameListener(Ogre::SceneNode* node,RenderWindow* win,Ogre::Camera* cam/*1 begin*/,Ogre::Entity* ent/*1 end*/):
_node(node),_cam(cam),_PolygonMode(Ogre::PolygonMode::PM_SOLID)/*1 begin*/,_ent(ent)/*1 end*//*3 begin*/,_WalkingSpeed(50.0f),_rotation(0.0f)/*3 end*/
{
size_t windowHnd=0;
std::stringstream windowHndStr;
win->getCustomAttribute("WINDOW",&windowHnd);
windowHndStr<<windowHnd;
OIS::ParamList pl;
pl.insert(std::make_pair(std::string("WINDOW"),windowHndStr.str()));
_man=OIS::InputManager::createInputSystem(pl);
_key=static_cast<OIS::Keyboard*>(_man->createInputObject(OIS::OISKeyboard,false));
_mouse=static_cast<OIS::Mouse*>(_man->createInputObject(OIS::OISMouse,false));
bRPressed=false;
//1.1 begin
//_aniState=_ent->getAnimationState("Dance");
//1.1 end
//2_1|1.1 begin
_aniState=_ent->getAnimationState("RunBase");
_aniStateTop=_ent->getAnimationState("RunTop");
//2_1|1.1 end
}
~Example25FrameListener()
{
_man->destroyInputObject(_key);
_man->destroyInputObject(_mouse);
OIS::InputManager::destroyInputSystem(_man);
}
bool frameStarted(const Ogre::FrameEvent& evt)
{
bool walked = false;
Ogre::Vector3 SinbadTranslate(0,0,0);
_key->capture();
if(_key->isKeyDown(OIS::KC_ESCAPE))
return false;
//3 begin
if(_key->isKeyDown(OIS::KC_UP))
{
SinbadTranslate+=Ogre::Vector3(0,0,-1);
_rotation=3.14f;
walked=true;
}
if(_key->isKeyDown(OIS::KC_DOWN))
{
SinbadTranslate+=Ogre::Vector3(0,0,1);
_rotation=0.0f;
walked=true;
}
if(_key->isKeyDown(OIS::KC_LEFT))
{
SinbadTranslate+=Ogre::Vector3(-1,0,0);
_rotation=-1.57f;
walked=true;
}
if(_key->isKeyDown(OIS::KC_RIGHT))
{
SinbadTranslate+=Ogre::Vector3(1,0,0);
_rotation=1.57f;
walked=true;
}
//3 end
Ogre::Vector3 translate=Ogre::Vector3(0,0,0);
Real Speed=1;
if(_key->isKeyDown(OIS::KC_LSHIFT))
{
Speed=10;
}
if(_key->isKeyDown(OIS::KC_W))
{
translate+=Ogre::Vector3(0,0,-10);
}
if(_key->isKeyDown(OIS::KC_S))
{
translate+=Ogre::Vector3(0,0,10);
}
if(_key->isKeyDown(OIS::KC_A))
{
translate+=Ogre::Vector3(-10,0,0);
}
if(_key->isKeyDown(OIS::KC_D))
{
translate+=Ogre::Vector3(10,0,0);
}
if(_key->isKeyDown(OIS::KC_LCONTROL) && _key->isKeyDown(OIS::KC_C))
translate+=Ogre::Vector3(0,10,0);
if(_key->isKeyDown(OIS::KC_R) && !bRPressed)
{
bRPressed=true;
if(_PolygonMode==PM_SOLID)
_PolygonMode=Ogre::PolygonMode::PM_WIREFRAME;
else if(_PolygonMode==PM_WIREFRAME)
_PolygonMode=Ogre::PolygonMode::PM_POINTS;
else if(_PolygonMode==PM_POINTS)
_PolygonMode=Ogre::PolygonMode::PM_SOLID;
}
if(bRPressed && !_key->isKeyDown(OIS::KC_R))
bRPressed=false;
_mouse->capture();
float rotX=_mouse->getMouseState().X.rel*evt.timeSinceLastFrame*-1;
float rotY=_mouse->getMouseState().Y.rel*evt.timeSinceLastFrame*-1;
_cam->yaw(Ogre::Radian(rotX));
_cam->pitch(Ogre::Radian(rotY));
_cam->moveRelative(translate*evt.timeSinceLastFrame*Speed);
_cam->setPolygonMode(_PolygonMode);
//1 begin
_aniState->addTime(evt.timeSinceLastFrame);
//1.1 begin
//_aniState->setEnabled(true);//After we got the animation state,we enabled it.This tell Ogre 3D to play this animation.
//_aniState->setLoop(true);//Also,we set the loop property to true so the animation will be played again and again until we stop it.
//1.1 end
//3_2|1.1 begin
_aniState->setLoop(false);
//3_2|1.1 end
//1 end
//2_1 begin
_aniStateTop->addTime(evt.timeSinceLastFrame);
//2.1 begin
//_aniStateTop->setEnabled(true);
//_aniStateTop->setLoop(true);
//2.1 end
//3_2|2.1 begin
_aniStateTop->setLoop(false);
//3_2|2.1 end
//2_1 end
//3_2 begin
if(walked)
{
_aniState->setEnabled(true);
_aniStateTop->setEnabled(true);
if(_aniState->hasEnded())
_aniState->setTimePosition(0.0f);
if(_aniStateTop->hasEnded())
_aniStateTop->setTimePosition(0.0f);
}
else
{
_aniState->setTimePosition(0.0f);
_aniState->setEnabled(false);
_aniStateTop->setTimePosition(0.0f);
_aniStateTop->setEnabled(false);
}
_node->translate(SinbadTranslate*evt.timeSinceLastFrame*_WalkingSpeed);
_node->resetOrientation();
_node->yaw(Ogre::Radian(_rotation));
//3_2 end
return true;
}
private:
Ogre::SceneNode* _node;
OIS::InputManager* _man;
OIS::Keyboard* _key;
Ogre::Camera* _cam;
OIS::Mouse* _mouse;
Ogre::PolygonMode _PolygonMode;
bool bRPressed;
//1 begin
Ogre::Entity* _ent;
Ogre::AnimationState* _aniState;
//1 end
//2_1 begin
Ogre::AnimationState* _aniStateTop;
//2_1 end
//3_2 begin
float _WalkingSpeed;
float _rotation;
//3_2 end
};
class Example1:public ExampleApplication
{
public:
Example1()
{
FrameListener=NULL;
}
~Example1()
{
if(FrameListener)
{
delete FrameListener;
}
}
void createScene()
{
Ogre::Plane plane(Vector3::UNIT_Y,-10);
Ogre::MeshManager::getSingleton().createPlane("planemesh",ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,plane,1500,1500,200,200,true,1,5,5,Vector3::UNIT_Z);
Ogre::Entity* LightPlane=mSceneMgr->createEntity("LightPlane","planemesh");
mSceneMgr->getRootSceneNode()->createChildSceneNode()->attachObject(LightPlane);
LightPlane->setMaterialName("Examples/BeachStones");
Ogre::Light* DirectionalLight=mSceneMgr->createLight("MyDirectionalLight");
DirectionalLight->setType(Ogre::Light::LT_DIRECTIONAL);
DirectionalLight->setDirection(Ogre::Vector3(1,-1,0));
Ogre::SceneNode* SubNodeRoot=mSceneMgr->getRootSceneNode()->createChildSceneNode("SubNodeRoot");
_SinbadEnt=mSceneMgr->createEntity("Sinbad","Sinbad.mesh");
_SinbadNode=SubNodeRoot->createChildSceneNode("SinbadNode");
_SinbadNode->setPosition(Ogre::Vector3(0.0f,4.0f,0.0f));
_SinbadNode->setScale(3.0f,3.0f,3.0f);
_SinbadNode->attachObject(_SinbadEnt);
mSceneMgr->setShadowTechnique(Ogre::SHADOWTYPE_STENCIL_ADDITIVE);
//4_3 begin
Ogre::Entity* sword1=mSceneMgr->createEntity("Sword1","Sword.mesh");
Ogre::Entity* sword2=mSceneMgr->createEntity("Sword2","Sword.mesh");
_SinbadEnt->attachObjectToBone("Handle.L",sword1);
_SinbadEnt->attachObjectToBone("Handle.R",sword2);
//4_3 end
//5_4 begin
Ogre::AnimationStateSet* set=_SinbadEnt->getAllAnimationStates();
Ogre::AnimationStateIterator iter=set->getAnimationStateIterator();
std::string stateStr;
while(iter.hasMoreElements())
{
stateStr+=iter.getNext()->getAnimationName();
stateStr+="\n";
}
MessageBox(NULL,stateStr.c_str(),"All animations",0);
//5_4 end
}
void createCamera()
{
mCamera=mSceneMgr->createCamera("MyCamera1");
mCamera->setPosition(Ogre::Vector3(0,100,200));
mCamera->lookAt(0,0,0);
mCamera->setNearClipDistance(5);
}
void createFrameListener()
{
FrameListener=new Example25FrameListener(_SinbadNode,mWindow,mCamera,_SinbadEnt);
mRoot->addFrameListener(FrameListener);
}
private:
Ogre::SceneNode* _SinbadNode;
Ogre::FrameListener* FrameListener;
Ogre::Entity* _SinbadEnt;
};
INT WINAPI WinMain( __in HINSTANCE hInstance, __in_opt HINSTANCE hPrevInstance, __in_opt LPSTR lpCmdLine, __in int nShowCmd)
{
Example1 app;
app.go();
return 0;
}