设为首页 加入收藏

TOP

2.4 在LINUX C++中运行第一个程序(3)
2013-10-07 16:05:46 来源: 作者: 【 】 浏览:81
Tags:2.4 LINUX 运行 一个 程序

2.4  在LINUX C++(www.cppentry.com)中运行第一个程序(3)

编译执行HelloPanda3D-02后,显示如图2.9左侧所示的青葱绿地和竹林。

 
(点击查看大图)图2.9  通过C++(www.cppentry.com)显示青葱绿地和竹林

如果进一步地将window->setup_trackball()前的注释符"//"去除,编译后执行结果如图2.9右侧所示。此时,用鼠标在场景中拖动,可以转换场景的不同视角。不过,这种相机位置控制不是很方便,显得有些迟缓和笨拙,因为我们无法明确相机的方位。相机控制方式与Python一致,如前面表2.2所示。同样,文件目录使用的是正斜杠"/",Panda3D使用的是地理坐标系统,环境文件environment是以egg格式记录保存的三维模型"蛋"。

游戏中的相机控制需要通过编程(www.cppentry.com)来实现。假设现在需要旋转相机,应该编写以下代码(HelloPanda3D-03.cxx):

  1. #include "pandaFramework.h"  
  2. #include "pandaSystem.h"  
  3.  
  4. #include "genericAsyncTask.h"  
  5. #include "asyncTaskManager.h"  
  6.  
  7. PandaFramework framework;  
  8. //全局任务管理器  
  9. PT(AsyncTaskManager) taskMgr = AsyncTaskManager::get_global_ptr();   
  10. //全局时钟  
  11. PT(ClockObject) globalClock = ClockObject::get_global_clock();  
  12. //用于保存相机的实例  
  13. NodePath camera;  
  14.  
  15. //通过全局或静态函数定义任务,返回DoneStatus  
  16. //以任务对象及void*指针作为参数,包含各种用户数据  
  17. //还可以从AsyncTask派生子类并重载do_task方法  
  18. AsyncTask::DoneStatus spinCameraTask(GenericAsyncTask* task, void* data) {  
  19. //计算新位置和方向  
  20. double time = globalClock->get_real_time();  
  21. double angledegrees = time * 6.0;  
  22. double angleradians = angledegrees * (3.14 / 180.0);  
  23. camera.set_pos(20*sin(angleradians),-20.0*cos(angleradians),3);  
  24. camera.set_hpr(angledegrees, 0, 0);  
  25.  
  26. //通知任务管理器下一帧继续本任务  
  27. return AsyncTask::DS_cont;  
  28. }  
  29.  
  30. int main(int argc, char *argv[]) {  
  31. //打开一个新窗口框架并设置窗口标题  
  32. framework.open_framework(argc, argv);  
  33. framework.set_window_title("My Panda3D Window");  
  34. WindowFramework *window = framework.open_window();  
  35. //检查是否载入窗口  
  36. if (window != (WindowFramework *)NULL) {  
  37.  
  38. window->enable_keyboard(); //允许接收键盘事件  
  39. window->setup_trackball(); //允许相机移动  
  40.  
  41. //获取当前相机并保存在指定实例中  
  42. camera = window->get_camera_group();  
  43.  
  44. //载入环境模型  
  45. NodePath environ =   
  46. window->load_model(framework.get_models(), "models/environment");  
  47. //设置环境模型的父实例  
  48. environ.reparent_to(window->get_render());  
  49. //对模型进行比例及位置调整  
  50. environ.set_scale(0.25, 0.25, 0.25);  
  51. environ.set_pos(-8, 42, 0);  
  52.  
  53. //定义任务,未向任务传递客户数据  
  54. taskMgr->add(  
  55. new GenericAsyncTask("Spins the camera", &spinCameraTask, (void*) NULL));  
  56.  
  57. //引擎主循环  
  58. framework.main_loop();  
  59. } else {  
  60. nout << "Could not load the window!\n";  
  61. }  
  62. //关闭引擎框架  
  63. framework.close_all_windows();  
  64. framework.close_framework();  
  65. return (0);  
  66. }  

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇2.4 在LINUX C++中运行第一个程序.. 下一篇2.4 在LINUX C++中运行第一个程序..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·用 C 语言或者限制使 (2025-12-25 08:50:05)
·C++构造shared_ptr为 (2025-12-25 08:50:01)
·既然引用计数在做 GC (2025-12-25 08:49:59)
·Java 编程和 c 语言 (2025-12-25 08:19:48)
·. net内存管理宝典这 (2025-12-25 08:19:46)