3D FPS

1234567890

  C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  57 Posts :: 2 Stories :: 57 Comments :: 0 Trackbacks

常用链接

留言簿(10)

我参与的团队

搜索

  •  

最新评论

阅读排行榜

评论排行榜

1.2008/9/10 3:51:40

2.glest再分析

3.分析方法同表现形式都以文本来体现

// 所以这个是main
4.int glestMain(int argc, char** argv){

 MainWindow *mainWindow= NULL;
 Program *program= NULL;
 ExceptionHandler exceptionHandler;
 exceptionHandler.install();

 try{
  //配置文件的 程序开启的
  Config &config = Config::getInstance();

  showCursor(config.getBool("Windowed"));
  //创建一个程序
  program= new Program();
  //创建一个窗口 以程序指针放在窗口里 可以调用窗口内的程序
  mainWindow= new MainWindow(program);

  //分析命令行 然后就根据程序设置窗口
  if(argc==2 && string(argv[1])=="-server"){
   program->initServer(mainWindow);
  }
  else if(argc==3 && string(argv[1])=="-client"){
   program->initClient(mainWindow, Ip(argv[2]));
  }
  else{
   program->initNormal(mainWindow);
  }

  //main loop
  while(Window::handleEvent()){
   program->loop();
  }
 }
 catch(const exception &e){
  restoreVideoMode();
  exceptionMessage(e);
 } 

 delete mainWindow;

 return 0;
}

5.体误是窗口里有程序指针 程序里有窗口指针 两个互相叼


6.如是这样 就是《配置,窗口,程序,错误》这么4个类
所以一个一个分析

-----------------我是顶顶顶顶的分割线------------------------


7.MainWindow这个类是把设置一个程序指针在里面 然后把消息交给程序处理 继成那个WindowGl类
 将消息交给程序 处理消息这个东西应该在继成的类中
 因为我无看见

8.WindowGl这个类继成Window这个类
 内有一个ContextGl实例类 还有3个方法initGl,makeCurrentGl,swapBuffersGl
 三个方法基本上就是ContextGl的方法 看来就真的是这样的GL布局的Windows
 
 
9.好 看window这个类 基本上这个才真正的是一个window窗口了
 看看先 成员有好多 先看私有成员
  1.一个map 包窗口句柄与窗口指针 具体作用暂时不知道 应该保存东西 就保存窗口的 的吧
  2.成员里有好多标志的东西 还有好多属性的东西 都是窗口的 关于大小 长宽 全屏 句柄 设备DC
 好 看成员函数
  1.好多get set 应该是成员属性多吧
  2.重要的createWindow
      registerWindow
      LRESULT CALLBACK Window::eventRouter
      Window::handleEvent
       
  3.看得出像普通窗口一样就设置回调消息函数
 OK 这个类无继成什么东西了 应该是根的了
 
 
10.看那个program吧


-----------------可耕地可耕地枯无可奈何花落去 可耕地--------------

11.Program竟然无继成什么东西喔 用的是内插的方法
  比较重要的 ProgramState *programState;
        PerformanceTimer fpsTimer;
        WindowGl *window;
       
  成员函数有 1. initNormal(WindowGl *window);
          initServer(WindowGl *window);
           initClient(WindowGl *window, const Ip &serverIp);
          
        2.mouse key 的处理
        3.init,loop,setState,setDisplaySettings
        
12.看那个initNormal吧
 void Program::initNormal(WindowGl *window){
 init(window);
 setState(new Intro(this));
}

13.好 看那个init(window)吧 我考 这么的长 真长呀 长呀

void Program::init(WindowGl *window){
 //最基本的要设置 的 窗口与配置啦
 this->window= window;
 Config &config= Config::getInstance();
 
   //set video mode设置显示的模式
 setDisplaySettings();

 //window窗口的创建也是在这里的 晕死 程序走向也太那个了吧
 window->setText("Glest");
 window->setStyle(config.getBool("Windowed")? wsWindowedFixed: wsFullscreen);
 window->setPos(0, 0);
 window->setSize(config.getInt("ScreenWidth"), config.getInt("ScreenHeight"));
 window->create();
  
 //timers 时间的东西
 fpsTimer.init(1, maxTimes);
 updateTimer.init(GameConstants::updateFps, maxTimes);
 updateCameraTimer.init(GameConstants::cameraFps, maxTimes);

   //log start 日志的东西
 Logger &logger= Logger::getInstance();
 logger.setFile("glest.log");
 logger.clear();

 //lang 语言吧这里是语言吧
 Lang &lang= Lang::getInstance();
 lang.load("data/lang/"+ config.getString("Lang"));
   
 //render 渲染器的东西
 Renderer &renderer= Renderer::getInstance();

 window->initGl(config.getInt("ColorBits"), config.getInt("DepthBits"), config.getInt("StencilBits"));
 window->makeCurrentGl();
  
 //coreData, needs renderer, but must load before renderer init这时得到游戏的核心数据data
 CoreData &coreData= CoreData::getInstance();
    coreData.load();

 //init renderer (load global textures)OK这里渲染 是吧 应该
 renderer.init();

 //sound 这里是声音吧
 SoundRenderer &soundRenderer= SoundRenderer::getInstance();
 soundRenderer.init(window);
}

14.看那个setState吧 无意思 不解析
void Program::setState(ProgramState *programState){
 
 delete this->programState;
 
 this->programState= programState;
 programState->load();
 programState->init();

 updateTimer.reset();
 updateCameraTimer.reset();
 fpsTimer.reset();
}

15.看这个 竟然有个MainMenu的东西 应该是菜单的 不敢确定
void Program::initClient(WindowGl *window, const Ip &serverIp){
 MainMenu* mainMenu= NULL;
 
 init(window);
 mainMenu= new MainMenu(this);
 setState(mainMenu);
 mainMenu->setState(new MenuStateJoinGame(this, mainMenu, true, serverIp));
}

16.看这个 嗯 loop吧 在这里 程序也基本上出来了 不也就是这样的
void Program::loop(){

 //render
 programState->render();

 //update camera
 while(updateCameraTimer.isTime()){
  programState->updateCamera();
 }

 //update world
 while(updateTimer.isTime()){
  GraphicComponent::update();
  programState->update();
  SoundRenderer::getInstance().update();
  NetworkManager::getInstance().update();
 }
 
 //fps timer
 while(fpsTimer.isTime()){
  programState->tick();
 }
}

---------------------小结-----------------------
看来全在program中调用成员来做 辛苦 窗口也放在了程序里了
嗯 应该就可以看其他的子模块了 main好似已经被我拆解了
--------------------------------------------


17.ProgramState 这个比较关键喔 是状态 从字面上来理解 应该要看看
ProgramState竟然放了一个放一个program指针后 全是虚拟成员函数 看来是一个标准的东西

18.看来main还未被我拆解喔

19.那么我继续
这个是设置那个state的 好明显是交给了programstate了
void Program::setState(ProgramState *programState){
 
 delete this->programState;
 
 this->programState= programState;
 programState->load();
 programState->init();

 updateTimer.reset();
 updateCameraTimer.reset();
 fpsTimer.reset();
}

很有可能走去了这里 不过我还不清楚
void Game::load(){
 Logger::getInstance().setState(Lang::getInstance().get("Loading"));
 
 //tileset
    world.loadTileset(gameSettings.getTilesetPath(), &checksum);

    //tech, load before map because of resources
    world.loadTech(gameSettings.getTechPath(), &checksum);

    //map
    world.loadMap(gameSettings.getMapPath(), &checksum);
}

20.暂时设置那个mian架构是建立在那个嗯 之上的
在一个state之下 有一些继成 然后在继成里做一些东西 再交给指定的工人做乜

 


--------------我是不知道做什么的分割线-------------

21.好吧 这个就当是一个main的cpp吧


2008/9/11 20:36:18
 

posted on 2008-09-20 08:57 DK_jims 阅读(971) 评论(1)  编辑 收藏 引用

Feedback

# re: glest开源代码大概的分析[未登录] 2012-04-28 16:42 snow
你把最简单的分析了  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理