菜鸟也学Ogre-帧监听和无缓冲输入

本文介绍了如何使用OGRE游戏引擎进行游戏开发,重点讲解了FrameListeners的用途及UnbufferedInput的应用,通过具体代码示例展示了如何控制场景中的实体移动和灯光效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

OGRE中的 Frame Listeners和Unbuffered Input

FrameListener用于在帧渲染之前和渲染完成之后接收帧事件。
UnbuffereInput则是在帧监听中加入鼠标或是键盘,游戏手柄的判断,然后来做出相应的操作。
主要代码
void TutorialApplication::createScene(void)
{
mSceneMgr->setAmbientLight(Ogre::ColourValue(0.25, 0.25, 0.25));
Ogre::Entity* ninjaEntity = mSceneMgr->createEntity("Ninja", "ninja.mesh");
Ogre::SceneNode *node = mSceneMgr->getRootSceneNode()->createChildSceneNode("NinjaNode");
node->attachObject(ninjaEntity);
Ogre::Light* pointLight = mSceneMgr->createLight("pointLight");
pointLight->setType(Ogre::Light::LT_POINT);
pointLight->setPosition(Ogre::Vector3(250, 150, 250));
pointLight->setDiffuseColour(Ogre::ColourValue::White);
pointLight->setSpecularColour(Ogre::ColourValue::White);
}
//-------------------------------------------------------------------------------------
bool TutorialApplication::processUnbufferedInput(const Ogre::FrameEvent& evt)
{
static bool mMouseDown = false; // 鼠标是否被按下
static Ogre::Real mToggle = 0.0; // 按下的时间
static Ogre::Real mRotate = 0.13; // 旋转常量,设置旋转的快慢
static Ogre::Real mMove = 250; // 运动常量,设置移动的快慢


//利用鼠标左键控制灯光的暗灭
bool currMouse = mMouse->getMouseState().buttonDown(OIS::MB_Left);
if (currMouse && ! mMouseDown)
{
Ogre::Light* light = mSceneMgr->getLight("pointLight");
light->setVisible(! light->isVisible());
}
mMouseDown = currMouse;
//利用按键1来控制灯光
mToggle -= evt.timeSinceLastFrame;
if ((mToggle < 0.0f ) && mKeyboard->isKeyDown(OIS::KC_1))
{
mToggle = 0.5;
Ogre::Light* light = mSceneMgr->getLight("pointLight");
light->setVisible(! light->isVisible());
}


//设置IJKL键
Ogre::Vector3 transVector = Ogre::Vector3::ZERO;
if (mKeyboard->isKeyDown(OIS::KC_I)) // Forward
{
transVector.z -= mMove;
}
if (mKeyboard->isKeyDown(OIS::KC_K)) // Backward
{
transVector.z += mMove;
}
if (mKeyboard->isKeyDown(OIS::KC_J)) // Left - yaw or strafe
{
if(mKeyboard->isKeyDown( OIS::KC_LSHIFT ))
{
// Yaw left
mSceneMgr->getSceneNode("NinjaNode")->yaw(Ogre::Degree(mRotate * 5));
} else {
transVector.x -= mMove; // Strafe left
}
}
if (mKeyboard->isKeyDown(OIS::KC_L)) // Right - yaw or strafe
{
if(mKeyboard->isKeyDown( OIS::KC_LSHIFT ))
{
// Yaw right
mSceneMgr->getSceneNode("NinjaNode")->yaw(Ogre::Degree(-mRotate * 5));
} else {
transVector.x += mMove; // Strafe right
}


}
if (mKeyboard->isKeyDown(OIS::KC_U)) // Up
{
transVector.y += mMove;
}
if (mKeyboard->isKeyDown(OIS::KC_O)) // Down
{
transVector.y -= mMove;
}
mSceneMgr->getSceneNode("NinjaNode")->translate(transVector * evt.timeSinceLastFrame, Ogre::Node::TS_LOCAL);
return true;
}
//-------------------------------------------------------------------------------------
bool TutorialApplication::frameRenderingQueued(const Ogre::FrameEvent& evt)
{
bool ret = BaseApplication::frameRenderingQueued(evt);


if(!processUnbufferedInput(evt)) return false;


return ret;

}

最终效果:


2012-7-16

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值