热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

第二人生的源码分析(二十三)人物行走的键盘消息处理

前面介绍了怎么样显示人物角色,包括名称等等。那么人物角色是怎么样在里面行走的呢?第二人生是通过方向键来控制人物角色的走动,也就是说它是通过接收键盘的消息后不断地计算新的位置来实现移动。下面
前面介绍了怎么样显示人物角色,包括名称等等。那么人物角色是怎么样在里面行走的呢?第二人生是通过方向键来控制人物角色的走动,也就是说它是通过接收键盘的消息后不断地计算新的位置来实现移动。下面就是第二人生的消息处理函数代码:
#001 bool 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)!" <
#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" <
#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 深圳


推荐阅读
author-avatar
梦魇心芽_932
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有