前面介绍了怎么样显示人物角色,包括名称等等。那么人物角色是怎么样在里面行走的呢?第二人生是通过方向键来控制人物角色的走动,也就是说它是通过接收键盘的消息后不断地计算新的位置来实现移动。下面就是第二人生的消息处理函数代码:
#001bool LLAppViewer::mainLoop()
#002{
#003 //-------------------------------------------
#004 // Run main loop until time to quit
#005 //-------------------------------------------
#006
#007 // Create IO Pump to use for HTTP Requests.
#008 gServicePump = new LLPumpIO(gAPRPoolp);
#009 LLHTTPClient::setPump(*gServicePump);
#010 LLCurl::setCAFile(gDirUtilp->getCAFile());
#011
#012 // initialize voice stuff here
#013 gLocalSpeakerMgr = new LLLocalSpeakerMgr();
#014 gActiveChannelSpeakerMgr = new LLActiveSpeakerMgr();
#015
#016 LLVoiceChannel::initClass();
#017 LLVoiceClient::init(gServicePump);
#018
#019 LLMemType mt1(LLMemType::MTYPE_MAIN);
#020 LLTimer frameTimer,idleTimer;
#021 LLTimer debugTime;
#022
#023 // Handle messages
#024 while (!LLApp::isExiting())
#025 {
#026 LLFastTimer::reset(); // Should be outside of any timer instances
#027 {
#028 LLFastTimer t(LLFastTimer::FTM_FRAME);
#029
#030 {
#031 LLFastTimer t2(LLFastTimer::FTM_MESSAGES);
#032 #if LL_WINDOWS
#033 if (!LLWinDebug::setupExceptionHandler())
#034 {
#035 llwarns << " Someone took over my exception handler (post messagehandling)!" << llendl;
#036 }
#037 #endif
#038
#039 gViewerWindow->mWindow->gatherInput();
#040 }
#041
#042#if 1 && !RELEASE_FOR_DOWNLOAD
#043 // once per second debug info
#044 if (debugTime.getElapsedTimeF32() > 1.f)
#045 {
#046 debugTime.reset();
#047 }
#048#endif
#049
#050 if (!LLApp::isExiting())
#051 {
#052 // Scan keyboard for movement keys.Command keys and typing
#053 // are handled by windows callbacks.Don't do this until we're
#054 // done initializing.JC
#055 if (gViewerWindow->mWindow->getVisible()
#056 && gViewerWindow->getActive()
#057 && !gViewerWindow->mWindow->getMinimized()
#058 && LLStartUp::getStartupState() == STATE_STARTED
#059 && !gViewerWindow->getShowProgress()
#060 && !gFocusMgr.focusLocked())
#061 {
#062 gKeyboard->scanKeyboard();
#063 LLViewerJoystick::scanJoystick();
#064 }
#065
……
#193
#194 // Save snapshot for next time, if we made it through initialization
#195 if (STATE_STARTED == LLStartUp::getStartupState())
#196 {
#197 saveFinalSnapshot();
#198 }
#199
#200 delete gServicePump;
#201
#202 llinfos << "Exiting main_loop" << llendflush;
#203
#204 return true;
#205}
这里通过调用函数gKeyboard->scanKeyboard()来处理键盘消息的,它实现每个键盘的消息处理,然后调用文件llviewerkeyboard.cpp的函数bind_keyboard_functions()绑定的函数来处理每个事件。比如向前走,就进行如下操作:
gViewerKeyboard.bindNamedFunction("move_forward", camera_move_forward);
当按下向前的按键时,就会调用函数camera_move_forward来处理这个事件,这样就可以调整摄像像的位置,就实现了人物的行走。
蔡军生 2008/3/12 QQ:9073204 深圳
分享到:
相关推荐
网上收集的第二人生源码分析资料,感谢原创作者的无私支持!原作者就是CSDN的资深。。。
图解U-Boot:第二阶段源码分析(清晰)
网络上收集的quake3源码分析资料,感谢原创作者的无私奉献。第二人生和传奇的代码分析CSDN上就有,一并感谢各位资深的贡献!
Spring源代码分析(三):Spring JDBC Spring源代码解析(四):Spring MVC Spring源代码解析(五):Spring AOP获取Proxy Spring源代码解析(六):Spring声明式事务处理 Spring源代码解析(七):Spring AOP中对拦截器...
冈萨雷斯图像处理第二版及Matlab源码
数字图像处理的MATLAB实现第二版书上的源码,图片,还有一些小例题,帮助学习
包含电子工业出版社出版的数字图像处理(MATLAB版)(第二版)的m文件源码和原图片
Linux常见驱动源码分析(kernel hacker修炼之道)--李万鹏 李万鹏 IBM Linux Technology Center kernel team 驱动资料清单内容如下: Linux设备模型(中)之上层容器.pdf Linux设备模型(上)之底层模型.pdf Linux...
算法设计与分析(第二版)程序源码 贪心法 分治法 分支限界法 适用于老师或者学生
Kettle体系结构与源码分析,详细剖析Kettle的架构与源码,对Kettle的二次开发起关键指导作用
zookeeper源码分析(一)工作原理概述 zookeeper源码分析(二)FastLeader选举算法 Zookeeper源码分析之Paxos算法之旅
openfire源码分析资料,本人参与公司openfire修改,以及二次开发,终于找到了比较全面的openfire资料;吐血推荐,是openfire分析,修改,二次开发不可多得的资料。内附详细源码分析以及二次开发的方法还有数据库表...
第一章 系统架构总概 第二章 系统初始化 第三章 打开数据截获接口 第四章 插件初始化 第五章 检测规则初始化引擎 第六章 构建规则快速配匹引擎 第七章 数据包处理 snort流程 规则体系
在VISUAL C++中处理键盘消息的两种方法,在对话框和formview中不能得到键盘消息,本文给出了二种解决的办法。
qemu源码分析--qemu是开源的二进制翻译器,支持多种平台,具有很好的移植性。
《精通Visual C++数字图像处理典型算法及实现(第二版)》一书的附带源码,有较好的参考和学习价值
第二讲 图象的几何变换 第三讲 图象的平滑(去噪声),锐化 第四讲 图象的半影调和抖动技术 第五讲 直方图修正和彩色变换 第六讲 腐蚀,膨胀,细化算法 第七讲 边沿检测与提取,轮廓跟踪 第八讲 图象的检测,模板...
实际模式源码,实际模式源码实际模式源码实际模式源码实际模式源码实际模式源码实际模式源码
为C源码,包含一些最基本的图像处理,如显示,灰度,二值化,滤波等。
c#开发的软键盘源码,真实可用。能直接生成exe调用测试,可在此源码基础上做二次开发和修改。