热门标签 | 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 深圳


推荐阅读
  • [转]doc,ppt,xls文件格式转PDF格式http:blog.csdn.netlee353086articledetails7920355确实好用。需要注意的是#import ... [详细]
  • 本文详细解析了使用C++实现的键盘输入记录程序的源代码,该程序在Windows应用程序开发中具有很高的实用价值。键盘记录功能不仅在远程控制软件中广泛应用,还为开发者提供了强大的调试和监控工具。通过具体实例,本文深入探讨了C++键盘记录程序的设计与实现,适合需要相关技术的开发者参考。 ... [详细]
  • 本文将介绍如何在混合开发(Hybrid)应用中实现Native与HTML5的交互,包括基本概念、学习目标以及具体的实现步骤。 ... [详细]
  • 我有一个从C项目编译的.o文件,该文件引用了名为init_static_pool ... [详细]
  • 如果应用程序经常播放密集、急促而又短暂的音效(如游戏音效)那么使用MediaPlayer显得有些不太适合了。因为MediaPlayer存在如下缺点:1)延时时间较长,且资源占用率高 ... [详细]
  • Spring – Bean Life Cycle
    Spring – Bean Life Cycle ... [详细]
  • WinMain 函数详解及示例
    本文详细介绍了 WinMain 函数的参数及其用途,并提供了一个具体的示例代码来解析 WinMain 函数的实现。 ... [详细]
  • 实验九:使用SharedPreferences存储简单数据
    本实验旨在帮助学生理解和掌握使用SharedPreferences存储和读取简单数据的方法,包括程序参数和用户选项。 ... [详细]
  • 本文介绍了一种自定义的Android圆形进度条视图,支持在进度条上显示数字,并在圆心位置展示文字内容。通过自定义绘图和组件组合的方式实现,详细展示了自定义View的开发流程和关键技术点。示例代码和效果展示将在文章末尾提供。 ... [详细]
  • 在Cisco IOS XR系统中,存在提供服务的服务器和使用这些服务的客户端。本文深入探讨了进程与线程状态转换机制,分析了其在系统性能优化中的关键作用,并提出了改进措施,以提高系统的响应速度和资源利用率。通过详细研究状态转换的各个环节,本文为开发人员和系统管理员提供了实用的指导,旨在提升整体系统效率和稳定性。 ... [详细]
  • 使用 ListView 浏览安卓系统中的回收站文件 ... [详细]
  • 本文介绍了如何利用Shell脚本高效地部署MHA(MySQL High Availability)高可用集群。通过详细的脚本编写和配置示例,展示了自动化部署过程中的关键步骤和注意事项。该方法不仅简化了集群的部署流程,还提高了系统的稳定性和可用性。 ... [详细]
  • Java Socket 关键参数详解与优化建议
    Java Socket 的 API 虽然被广泛使用,但其关键参数的用途却鲜为人知。本文详细解析了 Java Socket 中的重要参数,如 backlog 参数,它用于控制服务器等待连接请求的队列长度。此外,还探讨了其他参数如 SO_TIMEOUT、SO_REUSEADDR 等的配置方法及其对性能的影响,并提供了优化建议,帮助开发者提升网络通信的稳定性和效率。 ... [详细]
  • Python 伦理黑客技术:深入探讨后门攻击(第三部分)
    在《Python 伦理黑客技术:深入探讨后门攻击(第三部分)》中,作者详细分析了后门攻击中的Socket问题。由于TCP协议基于流,难以确定消息批次的结束点,这给后门攻击的实现带来了挑战。为了解决这一问题,文章提出了一系列有效的技术方案,包括使用特定的分隔符和长度前缀,以确保数据包的准确传输和解析。这些方法不仅提高了攻击的隐蔽性和可靠性,还为安全研究人员提供了宝贵的参考。 ... [详细]
  • 优化后的标题:深入探讨网关安全:将微服务升级为OAuth2资源服务器的最佳实践
    本文深入探讨了如何将微服务升级为OAuth2资源服务器,以订单服务为例,详细介绍了在POM文件中添加 `spring-cloud-starter-oauth2` 依赖,并配置Spring Security以实现对微服务的保护。通过这一过程,不仅增强了系统的安全性,还提高了资源访问的可控性和灵活性。文章还讨论了最佳实践,包括如何配置OAuth2客户端和资源服务器,以及如何处理常见的安全问题和错误。 ... [详细]
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社区 版权所有