游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2229|回复: 0

OGRE ExampleApplication

[复制链接]

43

主题

155

帖子

171

积分

注册会员

Rank: 2

积分
171
发表于 2005-1-15 11:51:00 | 显示全部楼层 |阅读模式
现在开始看看如何在OGRE下创建一个应用程序。稍微浏览一下工程目录就可以发现OGRE用来示例DEMO所用的ExampleApplication是我们绝佳的起点,let's go~

首先浏览ExampleApplication的公共接口,就一个,
  virtual void go(void)
  {
      // 创建Root对象并初始化系统
      if (!setup())
          return;

      /*   Root对象的startRendering函数里面启动了标准WIN32窗口应用程序的消息循环...
      **   while( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) )
      **   {
      **        TranslateMessage( &msg );
      **            DispatchMessage( &msg );   
      **   }
      */
      mRoot->startRendering();
  }

再来看看setup里面做了什么事情,
    virtual bool setup(void)
    {
        // Root必须是OGRE里面创建的第一个对象
        mRoot = new Root();

        /* 从resources.cfg配置文件读取资源管理系统的资源查找路径,
        ** 如果要使用自己的资源,可以拷贝到OGRE设定的默认目录里或
        ** 者将自定义的目录添加到配置文件里面去。
        */
        setupResources();

        /* OGRE自带的系统配置窗口,枚举可用配置,从配置文件中读取
        ** 上一次的配置作为默认项,保存用户的更改。配置读取之后才
        ** 会调用Root对象的initialise函数进行初始化。
        */
        bool carryOn = configure();
        if (!carryOn) return false;

        /* 选择一个场景管理器,默认使用ST_GENERIC,表示不指定类型,
        ** 可用的参数参考枚举类型SceneType, 有室内(ST_INTERIOR)、
        ** 室外(ST_EXTERIOR_XX)等。我们可以手动改变这个参数来选择
        ** 最合适的方式。
        */
        chooseSceneManager();

        /* 创建一个摄像机,默认放到了Z轴500的位置指向-Z轴的方向,
        ** 近裁减平面为5个世界坐标长度距离,后面看Demo的时候要
        ** 记住,否则位置对不上。
        */
        createCamera();

        /* 创建视口,默认为映射到整个窗口大小。
        */         
        createViewports();

        /* 默认mipmap level,参考LOD,简单的说就是离视点越远的模型
        ** 纹理分辨率就越低,我们只需要提供一个精度的材质,其他精度
        ** 可以让系统代为生成,这里声明需要生成多少个等级。
        */
        TextureManager::getSingleton().setDefaultNumMipMaps(5);

        /* 纯抽象的方法,其他DEMO必须实现这个接口,以后要做的大部分
        ** 事情都在这里完成啦,如读取模型,设置场景等等。
        */
        createScene();

        /* 默认帧监听器,以后可以重载这个方法来注册我们自己的监听对象,
        ** 对角色/模型的控制代码就放在自定义的FrameListener里面。
        */
        createFrameListener();

        return true;

    }

以上就是一个OGER应用程序的创建过程。对比一下在WIN32平台下创建一个典型的窗口应用程序,消息循环已经在Root对象的startRendering里面找到了,注册窗口类和创建窗口的代码又在哪里呢?搜索一下,哈,在RenderSystem的实现例如RenderSystem_Direct3D9里, 熟悉的代码在这里躺着呢,

  /* OgreD3D9RenderWindow.cpp
  */

  // 声明一个winclass
  WNDCLASS wndClass = { ... };
  // 注册窗口类
  RegisterClass( &wndClass );

  // 创建窗口
  HWND hWnd = CreateWindow( ... );
  // 显示窗口
  ShowWindow(hWnd, SW_SHOWNORMAL);
  UpdateWindow(hWnd);  
  
  // 消息循环
  MSG  msg;
  while( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) )
  {
          TranslateMessage( &msg );
        DispatchMessage( &msg );
  }
  ...

真相大白了,读取配置后会调用Root对象的initialise函数,接着调用到当前RenderSystem的initialise,以上的Direct3D9 RenderSystem实现就会创建一个D3D9RenderWindow!

如果继承一个ExampleApplication实现一个最简单的OGRE应用程序,会看到创建出来的窗口并不是空荡荡的而是已经有了诸如FPS等统计信息,OGRE的LOGO等,这些东西哪里来的? 嗯,只能是ExampleFrameListener了...  (打字打得好辛苦 [em10])
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-12-24 02:17

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表