您的位置:首页 > 其它

irrlicht在mfc mdi窗口中使用的问题

2010-10-29 22:09 239 查看
irrlicht提供的例子基本都是console窗口的,唯一一个windows窗口例子也是通过irrlicht自带的run函数提供消息循环。本来只是想用opengl写一个简单的应用,可实在想用irrlicht的碰撞检测功能,没办法只好查了一下不使用run函数的使用方法,可网上中文资料实在太少,最后在irrlicht官网论坛翻贴加查看irrlicht代码,总算捣鼓出来了,呵呵。

查看CIrrDeviceWin32类run函数实现,可以看到它做了下面的一些事情:

1.计时器++,这里面的值在CSceneNodeAnimatorCameraFPS的移动操作里会用到。

2.分发消息,如果窗口句柄是irrlicht挂接的窗口,那么由irrlicht接管操作。

3.resizeIfNecessary,改变窗口大小

4.下面这个没细看,看样子是和游戏句柄相关的操作

这样来看,只要实现1,3,4,并在接收到消息的时候,把需要irrlicht接管的消息分发给他就可以了(对应2的操作)。

那么下面就简单了,假如irrlicht挂接的是某个view的句柄,那么只需要重载该view的windowproc函数,像下面这样:

LRESULT CDemoView::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{

if ( device )
device->getTimer()->tick();

//假如需要irrlicht接管某些按键(比如上下左右键)的WM_KEYDOWN消息,就在该消息的case中组合irr::SEvent,

//并通过smgr->postEventFromUser(evnt)改变irrlicht状态,最后别忘了重绘

}

另外可以派生一个IEventReceiver子类,用来处理各类鼠标按键消息,方便一些。

如果使用CSceneNodeAnimatorCameraFPS的话,鼠标会始终锁定在窗口中央,如果想点点菜单按钮工具栏什么的是没办法的,查看CSceneNodeAnimatorCameraFPS::animateNode可以知道它的实现。

如果想在系统窗口和irrlicht窗口之间切换,可以通过设置

camera->setInputReceiverEnabled函数以决定云不允许irrlicht窗口相应鼠标按键消息,默认CSceneNodeAnimatorCameraFPS会相应left,right,up,down,j键以及鼠标消息。

还有一种比较彻底的解决方法就是派生一个CSceneNodeAnimatorCameraFPS的子类,重写相应的方法,这样也可以通过SKeyMap扩充摄像机可以响应的按键消息。

乱七八糟写了这么些,也不知道有没人能看明白,语文不大好,呵呵。

PS:如果有朋友需要WindowProc的实现,可以给我发邮件cmoth@126.com
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: