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

隨筆 - 132  文章 - 51  trackbacks - 0
<2025年11月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456

常用鏈接

留言簿(7)

隨筆分類

隨筆檔案

文章分類

文章檔案

cocos2d-x

OGRE

OPenGL

搜索

  •  

最新評論

閱讀排行榜

評論排行榜


 關于文件版本塊的結(jié)構(gòu)定義方法。
 
×/

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

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

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

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

#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

只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導航: 博客園   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| 日韩午夜中文字幕| 亚洲一区二区三区四区中文| 香蕉乱码成人久久天堂爱免费| 欧美在线中文字幕| 玖玖国产精品视频| 亚洲精品久久久久久久久久久| 亚洲午夜三级在线| 久久青青草综合| 欧美日韩精品在线| 国内自拍一区| 亚洲午夜精品17c| 久久久久.com| 日韩午夜在线观看视频| 久久精品国产久精国产一老狼| 美女999久久久精品视频| 欧美日韩在线免费| 精品粉嫩aⅴ一区二区三区四区| 亚洲经典三级| 久久精品国内一区二区三区| 欧美激情亚洲精品| 午夜精品一区二区三区在线播放| 男人的天堂亚洲在线| 国产精品videosex极品| 亚洲电影下载| 欧美一区二区成人6969| 亚洲精品国产精品久久清纯直播| 久久精品亚洲热| 国产精品盗摄久久久| 裸体歌舞表演一区二区| 91久久国产综合久久蜜月精品| 亚洲欧洲av一区二区三区久久| 欧美国产欧美综合 | 亚洲国产美女精品久久久久∴| 亚洲一区制服诱惑| 亚洲第一级黄色片| 久久久久se| 国产日韩精品入口| 亚洲一区二区三区中文字幕在线| 免费在线亚洲| 国产日韩精品一区观看| 欧美激情乱人伦| 一区二区三区自拍| 久久激情中文| 午夜精品久久久久久久久久久久 | 狠狠噜噜久久| 欧美综合第一页| 亚洲欧美精品在线观看| 国产精品久久久久9999高清| 亚洲欧美美女| 亚洲尤物在线| 国产一区二区三区免费观看| 久久久99精品免费观看不卡| 欧美伊人久久久久久午夜久久久久 | 免费在线播放第一区高清av| 红桃视频一区| 蜜桃av久久久亚洲精品| 久久福利视频导航| 玖玖精品视频| 欧美调教视频| 亚洲视频综合| 亚洲另类在线一区| 国产精品人人做人人爽人人添| 亚洲精品日韩激情在线电影| 久久这里只有| 欧美一区在线看| 国产精品99久久久久久宅男| 欧美成人亚洲成人| 亚洲激情一区| 亚洲国产经典视频| 亚洲精品视频在线观看网站| 欧美网站在线观看| 亚洲一级电影| 日韩一级成人av| 欧美图区在线视频| 午夜免费久久久久| 性欧美大战久久久久久久免费观看| 国产精品久久久久久久9999| 欧美亚洲综合另类| 日韩视频在线观看免费| 国产精品日本一区二区| 欧美一区二区三区免费观看视频 | 久久久久看片| 久久久精品国产99久久精品芒果| 国产一区二区视频在线观看| 久久九九国产| 麻豆成人在线| 99精品国产在热久久下载| 最新中文字幕亚洲| 欧美一区二区大片| 在线播放不卡| 亚洲激情在线观看| 亚洲美女视频| 亚洲免费av片| 国产精品自拍视频| 久久久久久一区二区三区| 久久婷婷影院| 亚洲精品国产拍免费91在线| 亚洲人成网站777色婷婷| 欧美日韩一区二区国产| 亚洲免费电影在线| 久久www成人_看片免费不卡| 国产精品自拍视频| 欧美激情第三页| 国产精品久久久久高潮| 美日韩精品视频免费看| 欧美新色视频| 亚洲第一视频| 在线精品国产成人综合| 夜夜嗨av一区二区三区中文字幕| 国产麻豆日韩| 欧美高清视频在线观看| 国产精品美女999| 欧美激情成人在线| 国产欧美精品一区aⅴ影院| 欧美激情aⅴ一区二区三区| 欧美成人午夜激情| 亚洲福利电影| 国产视频精品xxxx| 日韩视频在线观看| 亚洲大片av| 亚洲一区尤物| 一区二区三区福利| 麻豆av一区二区三区久久| 亚洲国产精品久久久久| 久久在线免费| 欧美精品一区二区在线播放| 久久久久女教师免费一区| 欧美精品观看| 欧美成人r级一区二区三区| 国产精品一级二级三级| 亚洲免费久久| 亚洲九九爱视频| 在线亚洲精品福利网址导航| 亚洲日本中文字幕| 久久夜色精品亚洲噜噜国产mv | 久久久高清一区二区三区| 99国产精品久久久久久久久久| 欧美一站二站| 久久狠狠婷婷| 国产亚洲精品7777| 香蕉免费一区二区三区在线观看 | 国产精品免费区二区三区观看| 亚洲欧洲综合另类| 亚洲九九九在线观看| 欧美精品亚洲精品| 欧美一区二区三区免费大片| 国产精品久久久久久久久免费樱桃| 欧美一级黄色录像| 99re66热这里只有精品4| 欧美成人按摩| 亚洲国产精彩中文乱码av在线播放| 欧美主播一区二区三区美女 久久精品人 | 国产人久久人人人人爽| 亚洲视频你懂的| 亚洲伊人伊色伊影伊综合网| 欧美人牲a欧美精品| 99精品99| 欧美亚洲视频在线观看| 国产亚洲人成a一在线v站| 久久久精品动漫| 亚洲国产精品成人一区二区| 一本久久知道综合久久| 欧美婷婷在线| 性一交一乱一区二区洋洋av| 亚洲国产日韩一区二区| 一区二区三区成人| 国产精品美女在线| 久久精品国产一区二区三| 欧美大尺度在线| 久久久久久久97| 欧美成人视屏| 在线中文字幕日韩| 国产一区二区av| 欧美成人综合| 亚洲一区日本| 久久人人97超碰精品888| 亚洲高清不卡一区| 国产日韩一区二区三区| 久久一区二区三区av| 亚洲精品一区二区三区福利| 欧美一区二区三区婷婷月色| 亚洲福利视频专区| 欧美日韩视频免费播放| 亚洲国产中文字幕在线观看| 久久综合久久综合九色| 日韩天堂在线观看| 国产原创一区二区| 欧美激情精品久久久| 午夜在线视频一区二区区别|