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

隨筆 - 132  文章 - 51  trackbacks - 0
<2010年6月>
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910

常用鏈接

留言簿(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 風輕云淡 閱讀(304) 評論(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>
            亚洲视频一区二区在线观看| 亚洲在线观看免费| 一区二区免费在线播放| 亚洲高清在线观看一区| 亚洲精品日韩激情在线电影 | 欧美一区二区三区四区夜夜大片| 日韩午夜黄色| 先锋影音网一区二区| 欧美制服丝袜| 久久久久久久999| 欧美福利电影在线观看| 国产精品va在线| 韩国av一区二区三区| 99re66热这里只有精品4| 亚洲欧美日产图| 麻豆成人小视频| 亚洲精品午夜精品| 久久激情视频免费观看| 欧美日韩一区在线| 亚洲欧洲在线观看| 欧美mv日韩mv国产网站| 在线亚洲成人| 欧美精品在线一区二区| 黄色欧美日韩| 欧美一区二区三区日韩视频| 欧美国产1区2区| 久久久久亚洲综合| 一区视频在线播放| 久久婷婷国产综合尤物精品| 亚洲欧美韩国| 国产精品福利在线观看| 亚洲一区二区免费看| 亚洲精品一品区二品区三品区| 久久野战av| 伊人狠狠色j香婷婷综合| 久久综合精品国产一区二区三区| 欧美专区在线观看一区| 欧美在线视屏| 国产精品欧美一区二区三区奶水| 亚洲精品一区二区三区婷婷月 | 91久久综合| 日韩午夜在线观看视频| 国产精品美女久久久| 久久久精品五月天| 久久视频一区| 亚洲女同精品视频| 久久久久久久成人| 亚洲一区黄色| 久久aⅴ国产欧美74aaa| 亚洲免费激情| 欧美一区二区在线| 亚洲一区二区免费| 久久久欧美一区二区| 亚洲永久免费av| 欧美aaaaaaaa牛牛影院| 欧美在线免费看| 欧美日韩成人综合在线一区二区 | 亚洲国产婷婷香蕉久久久久久| 亚洲精品美女在线观看| 国产日韩欧美三级| 一区二区三区四区五区精品视频| 韩国自拍一区| 亚洲黄色免费| 另类激情亚洲| 亚洲成色www8888| 在线观看av一区| 香蕉久久久久久久av网站| 国产精品99久久久久久人| 美女黄色成人网| 伊人成年综合电影网| 久久精品电影| 亚洲福利在线视频| 久久久国产精彩视频美女艺术照福利| 亚洲影院色无极综合| 欧美韩国日本综合| 亚洲免费黄色| 午夜一区二区三区不卡视频| 欧美三级电影网| 亚洲婷婷综合色高清在线| 亚洲欧美国产毛片在线| 国产精品久久久免费| 亚洲一区二区三区精品动漫| 亚洲欧美日韩精品久久亚洲区 | 国产精品视频第一区| 久久电影一区| 亚洲国产成人在线播放| 亚洲无人区一区| 亚洲国产高清一区二区三区| 欧美国产日韩一区二区| 一区二区激情视频| 亚洲欧美一区在线| 亚洲高清久久网| 一本色道久久综合亚洲精品小说| 亚洲一区二区三区中文字幕在线| 久久久久久夜| 一本一本久久a久久精品综合麻豆 一本一本久久a久久精品牛牛影视 | 欧美成人精品影院| 午夜精品三级视频福利| 欧美国产日韩精品免费观看| 亚洲七七久久综合桃花剧情介绍| av成人免费在线| 伊人色综合久久天天| 国产精品久久久久7777婷婷| 榴莲视频成人在线观看| 欧美一区二区三区的| 亚洲精品中文字幕在线观看| 欧美黄色一区二区| 亚洲成人直播| 亚洲精品影视在线观看| 99国产精品视频免费观看一公开| 亚洲第一搞黄网站| 亚洲国产精品成人精品| 亚洲国产日日夜夜| 亚洲日产国产精品| 亚洲国产中文字幕在线观看| 最新中文字幕一区二区三区| 91久久精品久久国产性色也91| 欧美国产视频在线| 亚洲精品一区在线观看香蕉| 亚洲视频欧美在线| 性色一区二区| 美女主播一区| 欧美精品一区二区精品网| 欧美成人一区二区三区片免费| 久久一区二区三区av| 欧美另类videos死尸| 欧美日韩在线三级| 国产欧美在线看| 亚洲精品久久在线| 亚洲天堂偷拍| 欧美电影专区| 亚洲一区二区少妇| 欧美激情精品| 一区在线播放视频| 欧美一区二区三区视频免费播放| 久久精品成人一区二区三区蜜臀| 欧美大片在线看| 午夜视频久久久久久| 欧美日韩成人| 国产精品福利网| 欧美亚洲一区二区三区| 亚洲一区免费看| 欧美日韩在线免费观看| 狠狠综合久久av一区二区老牛| 亚洲伊人一本大道中文字幕| 亚洲电影观看| 亚洲欧洲精品一区二区| 亚洲在线观看免费视频| 欧美激情久久久久久| 久久久久久夜精品精品免费| 国产在线精品一区二区夜色| 亚洲欧美日韩在线一区| 欧美国产一区视频在线观看| 久热精品视频在线观看| 亚洲高清中文字幕| aa亚洲婷婷| 一区二区免费在线观看| 性欧美暴力猛交69hd| 激情综合中文娱乐网| 欧美黄污视频| 欧美剧在线免费观看网站| 99这里只有久久精品视频| 中国女人久久久| 亚洲经典三级| 欧美在线关看| 亚洲精品国精品久久99热| 一二三区精品| 影音先锋中文字幕一区二区| 欧美激情性爽国产精品17p| 国产精品成人午夜| 欧美激情视频给我| 国产一区二区三区高清在线观看 | 在线观看中文字幕亚洲| 亚洲人成在线观看网站高清| 欧美视频网站| 欧美国产免费| 久久视频一区二区| 欧美一区二区视频在线观看2020| 久久免费高清视频| 欧美一区二区三区免费观看| 欧美日韩调教| 日韩视频不卡| 亚洲人精品午夜在线观看| 亚洲一区制服诱惑| 午夜精品国产| 亚洲欧美国产精品桃花 | 91久久久精品| 亚洲国产成人精品久久| 久久精品日产第一区二区| 亚洲免费小视频| 国产精品久久久久久久久免费樱桃| 欧美成人中文| 日韩午夜在线观看视频| 欧美成人一区在线| 亚洲精品乱码久久久久久久久| 在线观看视频免费一区二区三区| 欧美与欧洲交xxxx免费观看| 久久久xxx| 亚洲国产欧洲综合997久久| 欧美成人综合一区|