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