Ogre按键消息

本文介绍了如何在Ogre框架中处理按键消息,通过创建`TutorialApplication`类并覆盖相关方法,实现对光照的切换及场景中对象的移动。通过监听键盘输入,调整场景中的点光源和Ninja实体的位置。

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

Ogre按键消息
现在来看ogre的按键消息。
class TutorialApplication : public BaseApplication
{
public:
    TutorialApplication(void);
    virtual ~TutorialApplication(void);

protected:
    virtual void createScene(void);
	virtual bool frameRenderingQueued(const Ogre::FrameEvent& fe);
private:
	bool processUnbufferedInput(const Ogre::FrameEvent& fe);
};

//---------------------------------------------------------------------------
void TutorialApplication::createScene(void)
{
    // Create your scene here :)

	mSceneMgr->setAmbientLight(Ogre::ColourValue(.25, .25, .25));
	
	Ogre::Light * pointLight = mSceneMgr->createLight("PointLight");
	pointLight->setType(Ogre::Light::LT_POINT);
	pointLight->setPosition(250,150,250);
	pointLight->setDiffuseColour(Ogre::ColourValue::White);
	pointLight->setSpecularColour(Ogre::ColourValue::White);

	Ogre::Entity* nijnaEnity = mSceneMgr->createEntity("ninja.mesh");
	Ogre::SceneNode* nijnaNode = mSceneMgr->getRootSceneNode()->createChildSceneNode("NinjaNode");
	nijnaNode->attachObject(nijnaEnity);



}

bool TutorialApplication::frameRenderingQueued(const Ogre::FrameEvent& fe)
{
	bool ret = BaseApplication::frameRenderingQueued(fe);
	if (!processUnbufferedInput(fe))
	{
		return false;
	}

	return ret;
}

bool TutorialApplication::processUnbufferedInput(const Ogre::FrameEvent& fe)
{
	static bool mouseDownLastFrame = false;
	static Ogre::Real toggleTimer = 0.0;
	static Ogre::Real rotate = .13;
	static Ogre::Real move = 250;
	
	bool leftMouseDown = mMouse->getMouseState().buttonDown(OIS::MB_Left);
	if (leftMouseDown && !mouseDownLastFrame)
	{
		Ogre::Light* light = mSceneMgr->getLight("PointLight");
		light->setVisible(!light->isVisible());
	}

	mouseDownLastFrame = leftMouseDown;

	toggleTimer -= fe.timeSinceLastFrame;
	if ((toggleTimer < 0)&& mMouse->getMouseState().buttonDown(OIS::MB_Right))
	{
		toggleTimer = 0.5;

		Ogre::Light* light = mSceneMgr->getLight("PointLight");
		light->setVisible(!light->isVisible());
	}

	Ogre::Vector3 dirVec = Ogre::Vector3::ZERO;

	if (mKeyboard->isKeyDown(OIS::KC_I))
	{
		dirVec.z -= move;
	}

	if (mKeyboard->isKeyDown(OIS::KC_K))
	{
		dirVec.z += move;
	}

	if (mKeyboard->isKeyDown(OIS::KC_U))
	{
		dirVec.y += move;
	}

	if (mKeyboard->isKeyDown(OIS::KC_O))
	{
		dirVec.y -= move;
	}

	if (mKeyboard->isKeyDown(OIS::KC_J))
	{
		if (mKeyboard->isKeyDown(OIS::KC_LSHIFT))
			mSceneMgr->getSceneNode("NinjaNode")->yaw(Ogre::Degree(5 * rotate));
		else
			dirVec.x -= move;
	}

	if (mKeyboard->isKeyDown(OIS::KC_L))
	{
		if (mKeyboard->isKeyDown(OIS::KC_LSHIFT))
			mSceneMgr->getSceneNode("NinjaNode")->yaw(Ogre::Degree(-5 * rotate));
		else
			dirVec.x += move;
	}

	mSceneMgr->getSceneNode("NinjaNode")->translate(
		dirVec * fe.timeSinceLastFrame,
		Ogre::Node::TS_LOCAL);

	return true;
}
我们在每一帧来检测按钮的响应。然后移动ninja.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值