读书人

Ogre中关于缓冲实现组合键播放动画的有

发布时间: 2012-11-10 10:48:51 作者: rapoo

Ogre中关于缓冲实现组合键播放动画的问题
小弟最近学习Ogre碰到了一个问题,就是当用缓冲输入的时候,同时按下两个键(即组合键)动画的播放会不正常,具体代码如下:


void ITutorial01::createScene(void)
{
// Set the default lighting.
mSceneMgr->setAmbientLight(Ogre::ColourValue(1.0f, 1.0f, 1.0f));//设置环境光为白色
// Create the entity
mEntity = mSceneMgr->createEntity("Ninja", "Ninja.mesh");//创建机器人节点

// Create the scene node
mNode = mSceneMgr->getRootSceneNode()->createChildSceneNode("NinjaNode", Ogre::Vector3(0.0f, 0.0f, 0.0f));
mNode->attachObject(mEntity);

mCamNode = mNode->createChildSceneNode("CameraNode", Ogre::Vector3(0.0f, 280.0f, 160.0f));

mCamera->setPosition(mCamNode->getPosition());
mCamera->lookAt(mNode->getPosition() + Ogre::Vector3(0.0f, 85.0f, 0.0f));

mCamNode->attachObject(mCamera);

Ogre::Entity *ent;
//定义一个平面
Plane plane1(Vector3::UNIT_Y, 0);

//通过该平面创建一个地面
MeshManager::getSingleton().createPlane("ground",ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, plane1,
15500,15500,5,5,true,1,5,5,Vector3::UNIT_Z);

ent=mSceneMgr->createEntity("GroundEntity","ground");//通过创建一个实体使地面显示出来
mSceneMgr->getRootSceneNode()->createChildSceneNode()->attachObject(ent);
ent->setMaterialName("Examples/Rockwall");//设置其纹理为石墙
ent->setCastShadows(false);//使地面不投影

}

void ITutorial01::createFrameListener(void){
BaseApplication::createFrameListener();

mAnimationState = mEntity->getAnimationState("Walk");
mAnimationState->setLoop(false);
mAnimationState->setEnabled(false);
// Set default values for variables
mDirection = mNode->getOrientation() * Ogre::Vector3::UNIT_X;

sign = 0;

mToggle = true;//组合按键状态开关
mRotate = 0.13;

mStealthSpeed = 20.0f;
mWalkSpeed = 85.0f;
//mDirection = Ogre::Vector3::ZERO;
}

bool ITutorial01::keyPressed( const OIS::KeyEvent &arg )
{
switch (arg.key)
{
case OIS::KC_1:

mAnimationState = mEntity->getAnimationState("Attack1");
mAnimationState->setLoop(true);
mAnimationState->setEnabled(true);
break;

case OIS::KC_2:

mAnimationState = mEntity->getAnimationState("Attack2");
mAnimationState->setLoop(true);
mAnimationState->setEnabled(true);
break;

case OIS::KC_3:

mAnimationState = mEntity->getAnimationState("Attack3");
mAnimationState->setLoop(true);
mAnimationState->setEnabled(true);
break;

case OIS::KC_4:

mAnimationState = mEntity->getAnimationState("Backflip");
mAnimationState->setLoop(true);
mAnimationState->setEnabled(true);
break;

case OIS::KC_LCONTROL:
if(::GetAsyncKeyState(0x57) & 0x8000f)
{
sign = STEALTH;
mAnimationState = mEntity->getAnimationState("Stealth");
mAnimationState->setLoop(true);
mAnimationState->setEnabled(true);
break;
}


case OIS::KC_W:
if(::GetAsyncKeyState(VK_LCONTROL) & 0x8000f)
{

sign = STEALTH;
mAnimationState = mEntity->getAnimationState("Stealth");
mAnimationState->setLoop(true);
mAnimationState->setEnabled(true);
break;

}
else{
sign = WALK;
mAnimationState = mEntity->getAnimationState("Walk");


mAnimationState->setLoop(true);
mAnimationState->setEnabled(true);
break;
}

case OIS::KC_S:
sign = WALK;
mNode->yaw(Degree(180));
mAnimationState = mEntity->getAnimationState("Walk");
mAnimationState->setLoop(true);
mAnimationState->setEnabled(true);
break;


case OIS::KC_A:
sign = LEFT;
mAnimationState = mEntity->getAnimationState("Walk");
mAnimationState->setLoop(true);
mAnimationState->setEnabled(true);
break;


case OIS::KC_D:
sign = RIGHT;
mAnimationState = mEntity->getAnimationState("Walk");
mAnimationState->setLoop(true);
mAnimationState->setEnabled(true);
break;

case OIS::KC_ESCAPE:
mShutDown = true;
break;
default:
break;
}
return true;

}

bool ITutorial01::keyReleased( const OIS::KeyEvent &arg )
{
switch (arg.key)
{
case OIS::KC_1:

mAnimationState = mEntity->getAnimationState("Attack1");
mAnimationState->setLoop(false);
mAnimationState->setEnabled(false);
break;

case OIS::KC_2:

mAnimationState = mEntity->getAnimationState("Attack2");
mAnimationState->setLoop(false);
mAnimationState->setEnabled(false);
break;

case OIS::KC_3:

mAnimationState = mEntity->getAnimationState("Attack3");
mAnimationState->setLoop(false);
mAnimationState->setEnabled(false);
break;

case OIS::KC_4:

mAnimationState = mEntity->getAnimationState("Backflip");
mAnimationState->setLoop(false);
mAnimationState->setEnabled(false);
break;


case OIS::KC_W:
if(::GetAsyncKeyState(VK_LCONTROL) & 0x8000f)
{

sign = STOP;
mAnimationState = mEntity->getAnimationState("Stealth");
mAnimationState->setLoop(false);
mAnimationState->setEnabled(false);

}
sign = STOP;
mAnimationState = mEntity->getAnimationState("Walk");
mAnimationState->setLoop(false);
mAnimationState->setEnabled(false);

break;



case OIS::KC_LCONTROL:

/*if(::GetAsyncKeyState(0x57) & 0x8000f)
{
sign = STOP;
mAnimationState = mEntity->getAnimationState("Walk");
mAnimationState->setLoop(false);
mAnimationState->setEnabled(false);
break;

}*/
sign = STOP;
mAnimationState = mEntity->getAnimationState("Stealth");
mAnimationState->setLoop(false);
mAnimationState->setEnabled(false);
break;

case OIS::KC_S:
sign = STOP;
mAnimationState = mEntity->getAnimationState("Walk");
mAnimationState->setLoop(false);
mAnimationState->setEnabled(false);
break;


case OIS::KC_A:
sign = STOP;
mAnimationState = mEntity->getAnimationState("Walk");
mAnimationState->setLoop(false);
mAnimationState->setEnabled(false);
break;


case OIS::KC_D:
sign = STOP;
mAnimationState = mEntity->getAnimationState("Walk");
mAnimationState->setLoop(false);
mAnimationState->setEnabled(false);
break;



default:
break;
}
return true;
}

bool ITutorial01::mouseMoved( const OIS::MouseEvent &arg )
{
if (arg.state.buttonDown(OIS::MB_Right))
{
mCamNode->yaw(Ogre::Degree(-mRotate * arg.state.X.rel), Ogre::Node::TS_WORLD);
mCamNode->pitch(Ogre::Degree(-mRotate * arg.state.Y.rel), Ogre::Node::TS_LOCAL);
}
updateCameraGoal(arg.state.Z.rel);
return true;
}

void ITutorial01::updateCameraGoal(Ogre::Real distChange)
{
mCamNode->translate(mCamDirection * distChange * 0.1f, Ogre::Node::TS_PARENT);//向父坐标系的z轴移动distChange距离

}

bool ITutorial01::mousePressed( const OIS::MouseEvent &arg, OIS::MouseButtonID id )
{
return true;
}

bool ITutorial01::mouseReleased( const OIS::MouseEvent &arg, OIS::MouseButtonID id )
{
return true;
}


bool ITutorial01::frameRenderingQueued(const Ogre::FrameEvent &mevt){

mKeyboard->capture();
mMouse->capture();

mDirection = -(mNode->getOrientation() * Ogre::Vector3::UNIT_Z);

mNinjaMove = mWalkSpeed * mevt.timeSinceLastFrame;
mNinjaMove2 = mStealthSpeed * mevt.timeSinceLastFrame;

switch(sign)
{
case LEFT:
mNode->yaw(Ogre::Degree(mRotate / 1.2f));
mNode->translate(mDirection * mNinjaMove);
break;

case RIGHT:
mNode->yaw(Ogre::Degree(-mRotate / 1.2f));
mNode->translate(mDirection * mNinjaMove);
break;

case WALK:
mNode->translate(mDirection * mNinjaMove);
break;

case STEALTH:
mNode->translate(mDirection * mNinjaMove2);
break;

default:
break;
}

mCamDirection = mCamNode->getOrientation()* Ogre::Vector3::UNIT_Y + mCamNode->getOrientation()* Ogre::Vector3::UNIT_Z;

mAnimationState->addTime(mevt.timeSinceLastFrame);//这一帧时间减去上一帧的时间差,帧率越小,步子越大,画面越卡

return BaseApplication::frameRenderingQueued(mevt);
}

#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
#define WIN32_LEAN_AND_MEAN
#include "windows.h"
#endif

#ifdef __cplusplus
extern "C" {
#endif

#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT )
#else
int main(int argc, char *argv[])
#endif
{
// Create application object
ITutorial01 app;

try {
app.go();
} catch( Ogre::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
std::cerr << "An exception has occured: " <<
e.getFullDescription().c_str() << std::endl;
#endif
}
return 0;
}
#ifdef __cplusplus
}
#endif
当运行后,单个按键及鼠标旋转缩放等功能完全正常,而当按下组合键后(上例是同时按下W和CONTROL),当先按CONTROL再按W,播放的动画正常 也就是潜行,当先按W在按CONTROL,播放的动画师行走和潜行的混合态

[解决办法]
Ogre了解很浅,基本帮不了。这样大批的代码的帖子,很少有人会仔细看的。

读书人网 >网络游戏

热点推荐