2.4 在LINUX C++(www.cppentry.com)中运行第一个程序(2)
上述命令中,有关参数所对应的路径及库文件如表2.3所示。如果源代码仅一两个文件,采用这种方式非常简单,如果是一个比较大的工程,行命令编译连接方式不可取,我们将采用Eclipse Helios构造编译整个工程。有关方式稍后再做说明。
表2.3 G++编译连接命令参数对应的路径
|
参 数< xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> |
默认安装对应路径 |
|
{pythoninclude} |
/usr/include/python2.6/ |
|
{panda3dinclude} |
/usr/include/panda3d/ |
|
{panda3dlibs} |
/usr/lib/panda3d/ /usr/lib/ |
|
库 |
libp3framework.so libpanda.so libpandafx.so libpandaexpress.so
libp3dtoolconfig.so libp3dtool.so libp3pystub.so libp3direct.so |
接下来,我们编写一系列cxx源文件,同样地创建一片青葱绿地和竹林,让憨态可掬的熊猫来回溜达向大家问好。
打开编辑器,创建一系列名称为HelloPanda3D-0X.cxx的源文件,按步骤编写代码。
Panda3D引擎典型的C++(www.cppentry.com)代码程序段结构如HelloPanda3D-01.cxx所示:
- #include "pandaFramework.h"
- #include "pandaSystem.h"
-
- PandaFramework framework;
-
- int main(int argc, char *argv[]) {
- //打开一个新窗口框架
- framework.open_framework(argc, argv);
- //设置窗口标题
- framework.set_window_title("Hello Panda3D World");
- //打开窗口
- WindowFramework *window = framework.open_window();
- //检查是否载入窗口
- if (window != (WindowFramework *)NULL) {
- nout << "Opened the window successfully!\n";
-
- window->enable_keyboard(); //允许接收键盘事件
- window->setup_trackball(); //允许相机移动
-
- //其他代码
-
- //引擎主循环
- framework.main_loop();
- } else {
- nout << "Could not load the window!\n";
- }
- //关闭引擎框架
- framework.close_all_windows();
- framework.close_framework();
- return (0);
- }
上述代码包含了pandaFramework.h及pandaSystem.h头文件,已经定义的框架类的实例会自动加载大部分Panda3D模块。其中的main_loop()函数构成游戏引擎的主循环,渲染主框架,处理后台任务。一般不返回,只需在代码最后一行进行调用。与mytest.cxx不同的是,典型结构中采用了异常分支处理方式,检查是否成功载入了窗口,并分别调用enable_keyboard()及setup_trackball()允许窗口处理键盘及相机移动事件。窗口类还包括一系列相关函数,例如设置窗口背景色,获取相机数等,有关内容可以参看函数手册。当然,开发者还可以进一步使用try...catch...finally等异常处理结构开发更健壮的代码,如果有兴趣可自行尝试。本书主要探讨与Panda3D游戏引擎有关的问题。
启动Panda3D引擎后,主要使用数据结构访问控制各种游戏元素。其中,Scene Graph以树的方式容纳各种需要渲染的对象。树的根对象是Render。场景对象则通过reparent_to()设置自己的父实例。随后,使用set_scale()、set_pos()调整模型比例和位置。将代码修改如下(HelloPanda3D-02.cxx):
- #include "pandaFramework.h"
- #include "pandaSystem.h"
-
- PandaFramework framework;
-
- int main(int argc, char *argv[]) {
- //打开一个新窗口框架并设置窗口标题
- framework.open_framework(argc, argv);
- framework.set_window_title("My Panda3D Window");
- WindowFramework *window = framework.open_window();
- //检查是否载入窗口
- if (window != (WindowFramework *)NULL) {
-
- window->enable_keyboard(); //允许接收键盘事件
- //window->setup_trackball(); //允许相机移动
-
- //载入环境模型
- NodePath environ =
- window->load_model(framework.get_models(), "models/environment");
- //设置环境模型的父实例
- environ.reparent_to(window->get_render());
- //对模型进行比例及位置调整
- environ.set_scale(0.25, 0.25, 0.25);
- environ.set_pos(-8, 42, 0);
-
- //引擎主循环
- framework.main_loop();
- } else {
- nout << "Could not load the window!\n";
- }
- //关闭引擎框架
- framework.close_all_windows();
- framework.close_framework();
- return (0);
- }