青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆 - 132  文章 - 51  trackbacks - 0
<2010年5月>
2526272829301
2345678
9101112131415
16171819202122
23242526272829
303112345

常用鏈接

留言簿(7)

隨筆分類

隨筆檔案

文章分類

文章檔案

cocos2d-x

OGRE

OPenGL

搜索

  •  

最新評論

閱讀排行榜

評論排行榜


 關于文件版本塊的結構定義方法。
 
×/

struct chunk{
 JDWORD type;
 JDWORD version;
 JDWORD size;
}

通過 type 來識別這個 chunk 的類型,如果是已知的類型就按照其對應的版本號 Version 來讀取數據
如果不是則跳過該 chunk 并給出一定的警告信息。

size 保存了這個 chunk 的實際長度,通常情況下不包含自己的長度。
可以通過和實際加載的數據長度進行對比,如果兩個值不行等,就說明其版本或者數據存在錯誤~無法繼續加載。

舉個例子。
 我們有一個結構體。
 struct MapInfo{
  int width;
  int height;
  int mapdata[100];
  
  // 下面兩個變量是在 2.0 版本之后才會出現的。
  int posX;
  int posY;
 };
 
 現在要把這個結構體按照我們的保存結構進行保存。
 
 首先給這個結構定義一種chunk類型,以確保他在程序中是唯一的標志。
 例如。 我們定義
 #define MAP_INFO_CHUNK_TYPE  0x1000
 #define MAP_INFO_CHUNK_VERSION 0x0010 //表示 1.0
 
 保存函數:
 JResult saveMapInfo( JIStream* pStream , const MapInfo* mi ){
  chunk c;
  c.type = MAP_INFO_CHUNK_TYPE;
  c.version = MAP_INFO_CHUNK_VERSION;  //根據不同的版本。進行寫入。
  c.size = 0;
  
  JDWORD cur_pos = pStream->getPos();
  pStream->write( c ); //先把數據寫入文件緩沖。(占位置)
  
  if( c.version >= 0x0010 ){
   c.size += pStream->write( mi->width );
   c.size += pStream->write( mi->height );
   c.size += pStream->write( mi->mapdata );
  }
  
  if( c.version >= 0x0020 ){ //
   c.size += pStream->write( mi->posX );
   c.size += pStream->write( mi->posY );
  }
  
  pStream->setPos( TPOS_SET , cur_pos );
  pStream->write( c ); //回寫chunk數據。
  
  return JROK;
 }
 
 讀取函數:
 JDWORD loadMapInfo( JIStream* pStream , const MapInfo* mi ){
  chunk c;
  JDWORD size = 0;
  size += pStream->read( &c );
  
  if( c.type != MAP_INFO_CHUNK_TYPE ){
   JSetLastErrorEx( "error chunk type!\n" );
   return size;
  }
  
  if( c.version >= 0x0010 ){
   size += pStream->read( mi->width );
   size += pStream->read( mi->height );
   size += pStream->read( mi->mapdata );
  }
  
  if( c.version >= 0x0020 ){ //未來各個版本之間的控制。 向下兼容。
   size += pStream->read( mi->posX );
   size += pStream->read( mi->posY );
  }
  
  //檢查數據讀取長度是否和chunk中記錄的相同!
  if( size != c.size ){
   JSetLastErrorEx( "data chunk have a error existed!\n" );
   return size;
  }
  
  return size; //這里應該返回該函數總共在這個過程中讀取的字節長度。
      //以便以后在多層次的嵌套或者遞歸式可以很方便的求出下一個chunk的位置。
 }
 
 大概就是如此。
  另外很多情況下一個chunk中可以包含很多子chunk以實現嵌套

#define    SCENE_VERSION_V1    100
#define SCENE_VERSION_V2    200
#define SCENE_VERSION_V3    300

#define SCENE_CURRENT_VERSION    SCENE_VERSION_V3

#define    HEADER_VERSION_V1    100
#define HEADER_VERSION_V2    200                                    
#define HEADER_VERSION_V3    300                                                                                    

#define HEADER_CURRENT_VERSION    HEADER_VERSION_V3

#define    GRID_VERSION_V1    100
#define GRID_VERSION_V2    200
#define GRID_VERSION_V3    300

#define GRID_CURRENT_VERSION    GRID_VERSION_V3


 1JResult GridDisplacement::saveMap( JIStream* pStream )
 2{    
 3#define    SAVECHUNK( func ) {    \
 4    chunk_t chunk;    \
 5    JIStream::tPos cpos = write_chunk( pStream , chunk );    \
 6    chunk.size =(JDWORD)(func);    \
 7    JIStream::tPos tcurrent = pStream->getPos();    \
 8    write_chunk( pStream , chunk , cpos );    \
 9    pStream->setPos( tcurrent , JIStream::TPOS_SET ); }

10
11    SAVECHUNK( save_header( &chunk , pStream ) );
12    SAVECHUNK( save_grid( &chunk , pStream ) );
13    SAVECHUNK( save_sector( &chunk , pStream ) );
14
15#undef SAVECHUNCK
16    return JR_OK;
17}

分成三個部分保存,header, grid ,sector,每個都有自己的版本控制,

 1size_t GridDisplacement::load_header( chunk_t* pc , JIStream* pStream )
 2{
 3    size_t size = 0;
 4    if( pc->version >= HEADER_VERSION_V1 ){
 5        size = pStream->read( name , sizeof( name ) );
 6    }

 7    
 8    if( pc->version >= HEADER_VERSION_V1+1 ){
 9        size += pStream->read( &player_info.start_point , sizeof( vec3 ) );
10    }

11    
12    //if( pc->version >= HEADER_VERSION_V4 ){
13    //    size += pStream->read( width );
14    //    size += pStream->read( height );
15    //}
16
17    return size;
18}

19
20size_t GridDisplacement::save_header( chunk_t* pc , JIStream* pStream )
21{
22    pc->version = HEADER_CURRENT_VERSION;
23    pc->name = MF_HEADER;
24
25    size_t size = 0;
26    size += pStream->write( name , sizeof(name) );
27    size += pStream->write( &player_info.start_point , sizeof( vec3 ) );
28    
29    //if( HEADER_CURRENT_VERSION >= HEADER_VERSION_V3 ){
30    //    size += pStream->write( width );                                        //HEADER_VERSION_V4 added
31    //    size += pStream->write( height );
32    //}
33
34    //size += pStream->write( pitch );
35    return size;
36}

37
38size_t GridDisplacement::load_grid( chunk_t* pc , JIStream* pStream )
39{
40    size_t size = 0;
41
42    size += pStream->read( width );
43    size += pStream->read( height );
44    size += pStream->read( pitch );
45
46    if( JROK( generate_maze( width , height ) ) ){
47        r_setLastErrorMsg( "load_grid error ! generate_maze" ) ;
48        return 0;
49    }

50
51    //    size += pStream->read( grids , pitch * height );
52
53    return size;
54}

55
56size_t GridDisplacement::save_grid( chunk_t* pc , JIStream* pStream )
57{
58    pc->version = GRID_CURRENT_VERSION;
59    pc->name = MF_GRIDS;
60
61    size_t size = 0;
62    size += pStream->write( width );
63    size += pStream->write( height );
64    size += pStream->write( pitch );
65
66    //    size += pStream->write( grids , pitch * height  );
67
68    return size;
69}


LoadMap分別加載

JResult    GridDisplacement::loadMap( JIStream* pStream )
{
    chunk_t    chunk;
    
//JResult result = JR_OK;
    const char*    lpszErrorPos = NULL;

//    while( !pStream->eof() )
    {
#define LOADCHUNK( func ) if( chunk.size != (func) ){ lpszErrorPos=#func;  goto _END; }
//        switch( chunk.name )
//        {
//        case MF_HEADER:
            pStream->read( &chunk , sizeof( chunk_t ) );
            LOADCHUNK( load_header( 
&chunk , pStream ) );
//            break;
//        case MF_GRIDS:
            pStream->read( &chunk , sizeof( chunk_t ) );
            LOADCHUNK( load_grid( 
&chunk , pStream ) );
//            break;
//        case MF_SECTOR:
            pStream->read( &chunk , sizeof( chunk_t ) );
            LOADCHUNK( load_sector( 
&chunk , pStream ) );
//            break;
//        default:
//            JNOTE( "GD_load_map_warning! unknow chunk%x\n" , chunk.name );
//            pStream->setPos( chunk.size , JIStream::TPOS_CUR );
//            break;
//        }
#undef LOADCHUNK
    }


_END:
    
if( lpszErrorPos ){
        
//JNOTE( "GD_load_map_error! pos:%s <%s>\n" , lpszErrorPos , r_getLastErrorMsg() );
        return JR_FAILED;
    }


    
forint i=0;i<sector_count;i++ ){
        Sector
* ps = &sectors[ i ];
        
forint j=0;j<ps->obj_list.count();j++ ){
            IObject
* pi = ps->obj_list[ j ];
            
if( pi && pi->getType() == IObject::LIGHT ){
                GLight
* light = (GLight*)pi;
                
if( light->light_ptr ){
                    light
->light_ptr->need_update_static_UT = JTRUE;
                    light
->light_ptr->need_update = JTRUE;
                }

            }

        }

    }


    
return JR_OK;
}
posted on 2010-05-20 15:46 風輕云淡 閱讀(308) 評論(0)  編輯 收藏 引用 所屬分類: GameDevelop

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久夜色精品国产欧美乱极品| 欧美午夜视频网站| 欧美一区成人| 久久精品久久99精品久久| 久久久噜噜噜| 欧美片在线观看| 欧美婷婷在线| 激情综合五月天| 日韩香蕉视频| 欧美在线综合| 亚洲黄色天堂| 中文久久乱码一区二区| 欧美亚洲免费高清在线观看| 欧美aaa级| 亚洲一区在线直播| 快she精品国产999| 国产精品入口夜色视频大尺度| 韩日成人在线| 欧美一级在线亚洲天堂| 噜噜噜躁狠狠躁狠狠精品视频| 亚洲精品在线观| 久久免费少妇高潮久久精品99| 欧美亚州在线观看| 久久精品中文字幕一区二区三区| 亚洲毛片在线观看.| 国产精品久久久久久久免费软件 | 欧美在线一二三区| 欧美日韩精品二区第二页| 尤物在线观看一区| 久久aⅴ国产欧美74aaa| 免费观看成人鲁鲁鲁鲁鲁视频| 国产免费观看久久| 亚洲欧美日韩另类| 一片黄亚洲嫩模| 欧美日韩三级视频| 99精品久久| 欧美在线视频观看免费网站| 亚洲免费高清| 亚洲美女一区| 欧美日韩一卡| 另类av导航| 国产精品一级二级三级| 亚洲人成人一区二区三区| 欧美高清在线视频观看不卡| 1769国产精品| 欧美激情va永久在线播放| 久久青草福利网站| 亚欧成人在线| 欧美日韩中文在线| 亚洲国产天堂久久综合| 欧美久久电影| 欧美成人a∨高清免费观看| 国产精品亚洲美女av网站| 亚洲欧洲精品一区二区精品久久久| 国产欧美91| 蜜臀av性久久久久蜜臀aⅴ四虎| 久久国产精品久久久久久| 欲色影视综合吧| 性做久久久久久免费观看欧美| 国内精品视频在线播放| 免费观看亚洲视频大全| 国产一区二区三区日韩欧美| 欧美国产1区2区| 欧美激情在线免费观看| 午夜影院日韩| 国产精品日韩在线观看| 一区二区高清在线观看| 在线亚洲电影| 欧美有码在线观看视频| 久久大香伊蕉在人线观看热2| 欧美亚洲成人免费| 亚洲视频网在线直播| 狠狠色综合日日| 欧美在线免费视屏| 久久亚洲春色中文字幕| 韩国一区二区在线观看| 久久婷婷成人综合色| 欧美96在线丨欧| 亚洲欧洲日本mm| 亚洲欧美国产77777| 亚洲欧洲日韩女同| 欧美福利视频| av成人免费观看| 伊人狠狠色j香婷婷综合| 久久久久久久欧美精品| 亚洲第一区在线观看| 国产欧美亚洲一区| 久久精品国产精品亚洲| 欧美福利视频在线| 99热精品在线| 国产乱码精品1区2区3区| 久久福利毛片| 亚洲精品你懂的| 亚洲最新中文字幕| 久久久久**毛片大全| 欧美激情免费观看| 在线视频精品一区| 国产女人水真多18毛片18精品视频| 欧美在线视频免费播放| 亚洲激情影院| 性欧美暴力猛交另类hd| 亚洲国产成人av| 欧美在线你懂的| 亚洲国产婷婷综合在线精品 | 国产欧美一区二区三区久久| 久久精品91久久久久久再现| 亚洲片区在线| 欧美一区二区视频网站| 亚洲人成在线播放| 国产精品少妇自拍| 欧美成人黄色小视频| 免费影视亚洲| 亚洲女性喷水在线观看一区| 在线观看久久av| 国产伦精品一区二区三区照片91| 久久亚洲私人国产精品va| 亚洲天天影视| 久久国产精品99国产| 亚洲乱码国产乱码精品精天堂| 国产日韩精品一区二区| 欧美日韩免费看| 欧美成人精品h版在线观看| 亚洲欧美日韩第一区| 欧美永久精品| 亚洲天堂成人在线视频| 亚洲成色www8888| 国产亚洲a∨片在线观看| 久久激情综合| 亚洲一区二区三区涩| 亚洲精品一区二区三区在线观看| 久久免费少妇高潮久久精品99| 伊人婷婷久久| 国产欧美日韩精品a在线观看| 欧美日韩国产成人| 欧美成人性生活| 开心色5月久久精品| 久久高清免费观看| 欧美一区视频在线| 亚洲一级网站| 亚洲天堂av高清| 一本色道久久综合亚洲精品不 | 小辣椒精品导航| 亚洲欧美一区二区精品久久久| 国产精品自在线| 国产精品久久久久免费a∨大胸 | 欧美大片va欧美在线播放| 久久久久久夜| 久久尤物视频| 毛片av中文字幕一区二区| 99精品欧美一区| 一区二区三区欧美视频| 亚洲美洲欧洲综合国产一区| 亚洲人成77777在线观看网| 亚洲精品美女久久7777777| 亚洲激情亚洲| 一区二区国产精品| 午夜激情久久久| 久久久久国产精品人| 久久亚洲一区二区| 欧美激情一区在线| 欧美日韩中文字幕| 国产日产亚洲精品| 精品999久久久| 亚洲精品中文字| 亚洲一区亚洲| 亚洲激情专区| 国外视频精品毛片| 激情欧美一区二区三区| 亚洲国产一区二区精品专区| 亚洲精品一二三区| 在线观看欧美| 一本色道久久加勒比精品| 亚洲影院色无极综合| 久久精品成人欧美大片古装| 亚洲午夜精品一区二区| 亚洲国产精品一区二区www在线 | 国产日韩在线亚洲字幕中文| 狠狠色综合网| 99国产精品久久久久久久| 午夜精品久久久久久久男人的天堂| 欧美一级午夜免费电影| 欧美.www| 亚洲影院一区| 欧美成人中文字幕| 国产女人aaa级久久久级| 亚洲人成高清| 久久国产精品黑丝| 亚洲欧洲日产国码二区| 午夜精品久久久久久99热| 免费日韩av电影| 国产欧美日韩在线| 日韩一级视频免费观看在线| 久久精品亚洲| 亚洲伦理网站| 久久综合中文色婷婷| 国产嫩草影院久久久久| 9色国产精品| 欧美1区2区| 午夜伦欧美伦电影理论片| 欧美日韩不卡一区|