错误一:很不值得一提的一个小错误,但是毕竟也是一个错误,作者在GameState退出时没有将Current_Object指针置空,导致在返回MenuState之后,如果再次进入GameState,点击一下鼠标左键这段代码就会发作:
if(m_pCurrentObject)
{
m_pCurrentObject->showBoundingBox(false);
m_pCurrentEntity->getSubEntity(1)->setMaterial(m_pOgreHeadMat);
}
导致程序中断跳出。
所谓“常在河边走,哪能不湿鞋”,对待蕴含着强大力量的指针,初始化和释放工作一定要慎之又慎。
解决方案:在GameState::exit()函数末尾补一句m_pCurrentObject=NULL就好了。
错误二:这个错误比较严重,但是不在advanced framework中添加新功能(尤其是骨骼动画)你却根本看不出来。在advanced framework中,并没有继承framelistener这个类,关于timeSinceLastFrame的计算,是通过Ogre的计时器实现的。
我们来看AppStateManager::start()这个函数:
//while循环中:
{
startTime = OgreFramework::getSingletonPtr()->m_pTimer->getMillisecondsCPU();//绘制一帧之前记录开始时间 OgreFramework::getSingletonPtr()->m_pKeyboard->capture(); OgreFramework::getSingletonPtr()->m_pMouse->capture();
m_ActiveStateStack.back()->update(timeSinceLastFrame);// GameState or MenuState or PauseState更新
OgreFramework::getSingletonPtr()->updateOgre(timeSinceLastFrame); OgreFramework::getSingletonPtr()->m_pRoot->renderOneFrame();//画一帧 timeSinceLastFrame = OgreFramework::getSingletonPtr()->m_pTimer->getMillisecondsCPU() - startTime;//计算画一帧花费的时间
}
注意代码中,计算时间的单位:Milliseconds!!!毫秒!
现在我们看getMillisecondsCPU()的返回值是什么? unsigned long!为了用整型计算替代浮点运算以加速,这个函数返回的根本不是毫秒,而是毫秒的一千倍整数!传递这样的参数将使你的程序状态加速1000倍!
解决方案:update(timeSinceLastFrame *1.0 /1000);
updateOgre(timeSinceLastFrame*1.0 /1000);