• <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>

            李錦俊(mybios)的blog

            游戲開發(fā) C++ Cocos2d-x OpenGL DirectX 數(shù)學(xué) 計(jì)算機(jī)圖形學(xué) SQL Server

              C++博客 :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
              86 Posts :: 0 Stories :: 370 Comments :: 0 Trackbacks

            公告

            QQ:30743734
            EMain:mybios@qq.com

            常用鏈接

            留言簿(16)

            我參與的團(tuán)隊(duì)

            最新隨筆

            搜索

            •  

            積分與排名

            • 積分 - 370208
            • 排名 - 67

            最新評論

            閱讀排行榜

            評論排行榜

            天龍八部GridInfo文件的格式已經(jīng)有人公布了,在這里:http://www.mobilegamebase.com/blog/article.asp?id=17
            不過,此文中有點(diǎn)筆誤的地方,就是那個(gè)nFirstLayerOP的位標(biāo)記的描述有點(diǎn)錯(cuò)誤,正確的應(yīng)該如下:
             // 圖片水平翻轉(zhuǎn),即左右翻轉(zhuǎn)
            #define FLIP_HORIZINTAL 1
             // 圖片垂直翻轉(zhuǎn),即上下翻轉(zhuǎn)
            #define FLIP_VERTICAL 2
             // 逆時(shí)針旋轉(zhuǎn)90度
            #define ANTICLOCKWISE_90 4
             // 以三角形的對角線鏡像,IndexOrder==0時(shí)就把左上的紋理坐標(biāo)復(fù)制到右下,否則把右上的坐標(biāo)復(fù)制到左下
            #define FLIP_DIAGONAL 8

            具體的讀取源碼如下,使用的是Ogre的資源管理器來讀取,另提供了saveToXML和saveToTGA的功能保存到XML文件和TGA文件:

            GridInfos.h
            #pragma once
            namespace Ogre
            {
                
            struct GridHeader
                
            {
                    DWORD nMagic;
                    
            // 版本號
                    DWORD nVersion;
                    
            // 地表寬度(橫向格子數(shù))
                    int nWidth;
                    
            // 地表高度(縱向格子數(shù))
                    int nHeight;
                }
            ;

                
            // 圖片水平翻轉(zhuǎn),即左右翻轉(zhuǎn)
            #define FLIP_HORIZINTAL 1
                
            // 圖片垂直翻轉(zhuǎn),即上下翻轉(zhuǎn)
            #define FLIP_VERTICAL 2
                
            // 逆時(shí)針旋轉(zhuǎn)90度
            #define ANTICLOCKWISE_90 4
                
            // 以三角形的對角線鏡像,IndexOrder==0時(shí)就把左上的紋理坐標(biāo)復(fù)制到右下,否則把右上的坐標(biāo)復(fù)制到左下
            #define FLIP_DIAGONAL 8

                
            // 單個(gè)網(wǎng)格信息
                struct GridInfo
                
            {
                    
            // 該值即為pixelmap的索引(第幾個(gè)pixelmap)
                    short    nFirstLayer;
                    
            // 對nFirstLayer的操作,取值是上面幾個(gè)定義的宏,可以互相組合
                    BYTE    nFirstLayerOp;
                    
            // 該值為pixelmap的索引
                    
            //天龍八部的地表最多可以兩層融合,說白了就是每個(gè)點(diǎn)里有兩層UV,這里為第二層pixelmap的索引
                    short    nSecondLayer;
                    
            // 對nSecondLayer的操作,取值同nFirstLayerOp
                    BYTE    nSecondLayerOp;
                    
            // 對格子的三角形的操作,可能取值如下
                    
            //    0正常三角形索引
                    
            //    1不同于正常的三角形索引
                    BYTE    IndexOrder;
                }
            ;


                
            // 整個(gè)地形的網(wǎng)格信息
                class GridInfos
                
            {
                
            public:
                    GridInfos(
            void);
                    
            virtual ~GridInfos(void);
                    
            // 打開網(wǎng)格文件
                    void open(const String &fileName , const String &groupName);
                    
            // 保存到XML文件中
                    void saveToXML(const String &xmlFileName);
                    
            // 保存到TGA文件中
                    void saveToTGA(const String &tgaFileName);
                    
            // 完畢并清空網(wǎng)格
                    void close();

                    typedef std::vector
            <GridInfo> GridData;
                    
            // 網(wǎng)格信息數(shù)組
                    GridData m_data;
                    
            // 寬高
                    size_t m_width , m_height;

                }
            ;

            }
            ;


            GridInfos.cpp
            #include "GridInfos.h"
            namespace Ogre
            {

                GridInfos::GridInfos(
            void)
                    : m_width(
            0)
                    , m_height(
            0)
                
            {
                }


                GridInfos::
            ~GridInfos(void)
                
            {
                    close();
                }


                
            // 打開網(wǎng)格文件
                void GridInfos::open(const String &fileName , const String &groupName)
                
            {
                    DataStreamPtr stream 
            = ResourceGroupManager::getSingleton().openResource(fileName , groupName);
                    
            if(stream.isNull()) 
                    

                        OGRE_EXCEPT(Exception::ERR_INTERNAL_ERROR, 
                            
            "打開地形網(wǎng)格文件失?。?/span>" + fileName, 
                            
            "GridInfos::open");
                        
            return ; 
                    }

                    GridHeader header;
                    
            // 讀取文件頭
                    stream->read(&header , sizeof(header));
                    m_width 
            = header.nWidth;
                    m_height 
            = header.nHeight;

                    
            bool largeVersion = false;
                    
            // 看版本號大于這個(gè),就表示后面跟著有個(gè)標(biāo)記用來表示結(jié)構(gòu)體的大小是7字節(jié)的版本還是5字節(jié)的版本
                    if(header.nVersion >= 0x00100001)
                    
            {
                        stream
            ->read(&largeVersion , sizeof(largeVersion));
                    }


                    size_t uCount 
            = m_width * m_height;
                    m_data.resize(uCount); 
                    BYTE byteValue;

                    
            for(size_t i = 0 ; i < uCount ; i ++)
                    
            {
                        GridInfo 
            &info = m_data[i];
                        
            if(largeVersion)
                        
            {
                            stream
            ->read(&info.nFirstLayer , 2);
                        }

                        
            else
                        
            {
                            stream
            ->read(&byteValue , 1);
                            info.nFirstLayer 
            = byteValue;
                        }

                        info.nFirstLayer
            --;


                        stream
            ->read(&info.nFirstLayerOp , 1);
                        
            if(largeVersion)
                        
            {
                            stream
            ->read(&info.nSecondLayer , 2);
                        }

                        
            else
                        
            {
                            stream
            ->read(&byteValue , 1);
                            info.nSecondLayer 
            = byteValue;
                        }

                        info.nSecondLayer
            --;
                        stream
            ->read(&info.nSecondLayerOp , 1);
                        stream
            ->read(&info.IndexOrder , 1);
                    }


                    
            //saveToXML(fileName + ".xml");

                }


                
            // 完畢并清空網(wǎng)格
                void GridInfos::close()
                
            {
                    m_width 
            = m_height = 0;
                    m_data.clear();
                }

                
            // 保存到TGA文件中
                void GridInfos::saveToTGA(const String &tgaFileName)
                
            {
                    size_t uCount 
            = m_width * m_height;
                    RGBA 
            *rgb = new RGBA[uCount];
                    
            for(size_t i = 0 ; i < uCount ; i ++)
                    
            {
                        rgb[i] 
            = ((ulong)m_data[i].nFirstLayer << 16l| (ulong)m_data[i].nSecondLayer;
                    }

                    Image image;
                    image.loadDynamicImage((uchar
            *)rgb , m_width , m_height , 1 , PF_A8R8G8B8);
                    image.save(tgaFileName);
                }

                
            // 保存到XML文件中
                void GridInfos::saveToXML(const String &xmlFileName)
                
            {
                    std::ofstream stream;
                    stream.open(xmlFileName.c_str());

                    stream 
            << "<Grids>" << std::endl;
                    
            for(size_t i = 0 ; i < m_data.size() ; i ++)
                    
            {
                        GridInfo 
            &info = m_data[i];
                        stream 
            << "<Grid x=" << i % m_width
                            
            << " z=" << i / m_width
                            
            << " FirstLayer=" << (int)info.nFirstLayer
                            
            << " FirstLayerOp=" << (int)info.nFirstLayerOp
                            
            << " SecondLayer=" << (int)info.nSecondLayer
                            
            << " SecondLayerOp=" << (int)info.nSecondLayerOp
                            
            << " IndexOrder=" << (int)info.IndexOrder
                            
            << "/>"
                            
            << std::endl
                            ;
                    }

                    stream 
            << "</Grids>" << std::endl;
                    stream.close();
                }



            }
            ;

            如果本文對你的開發(fā)有所幫助,并且你手頭恰好有零錢。

            不如打賞我一杯咖啡,鼓勵(lì)我繼續(xù)分享優(yōu)秀的文章。




            posted on 2009-07-26 20:36 李錦俊(mybios) 閱讀(5206) 評論(5)  編輯 收藏 引用 所屬分類: 3D引擎開發(fā)

            Feedback

            # re: 發(fā)布一個(gè)前段時(shí)間寫的天龍八部GridInfo讀取源碼 2009-07-27 00:57 lyo
            哈哈,終于有更正貼出現(xiàn)了
            我也是測試了半天才解決。。。
            http://lyodev.appspot.com/2009/07/analysis-of-the-amendment-gridinfo-dragon  回復(fù)  更多評論
              

            # re: 發(fā)布一個(gè)前段時(shí)間寫的天龍八部GridInfo讀取源碼 2009-07-27 08:04 李錦俊
            @lyo
            呵呵,同學(xué)所見略同啊  回復(fù)  更多評論
              

            # re: 發(fā)布一個(gè)前段時(shí)間寫的天龍八部GridInfo讀取源碼 2009-08-06 11:55 開源人
            不知道你為什么要把每個(gè)地塊的pixmapid都減1。info.nFirstLayer--;
            希望你把地形那塊也開源啊。。我們可以學(xué)下。。中國程序員太保守。  回復(fù)  更多評論
              

            # re: 發(fā)布一個(gè)前段時(shí)間寫的天龍八部GridInfo讀取源碼 2009-08-07 13:52 heha
            SecondLayer=-1 SecondLayerOp=255
            SecondLayer=-1 SecondLayerOp=255
            SecondLayer=-1 SecondLayerOp=255
            請問下,-1,255這些參數(shù)怎么理解。  回復(fù)  更多評論
              

            # re: 發(fā)布一個(gè)前段時(shí)間寫的天龍八部GridInfo讀取源碼 2009-08-10 20:49 mybios
            @heha
            SecondLayer=-1說明這層不使用,那后面的SecondLayerOp=255就更沒意義了。

            @開源人
            這里減一是因?yàn)樘忑埨锏倪@個(gè)id是從1開始的,0就代表這層不使用。
            而c程序的數(shù)組索引是從0開始的,所以在載入時(shí)一次性減一,以便在使用的時(shí)候不需要再減一,而判斷這層是否使用就改成用-1來判斷,而不是原來的0。  回復(fù)  更多評論
              

            久久综合色区| 久久精品国产半推半就| 久久人人爽人人爽人人av东京热| 亚洲日本久久久午夜精品| 色妞色综合久久夜夜| 亚洲欧美日韩久久精品第一区| 久久大香香蕉国产| 久久免费国产精品一区二区| 精品久久久久久国产免费了| 久久久国产视频| 97久久国产亚洲精品超碰热| www亚洲欲色成人久久精品| 欧美亚洲日本久久精品| 热re99久久6国产精品免费| 狠狠色丁香久久婷婷综| 亚洲AV伊人久久青青草原| 亚洲成色www久久网站夜月| 国产成人精品久久亚洲| 久久99精品久久久大学生| 日韩精品久久久久久| 久久久久久精品成人免费图片| 久久国产高清字幕中文| 亚洲午夜无码AV毛片久久| 丰满少妇高潮惨叫久久久| 女同久久| 99国产精品久久久久久久成人热| 色综合合久久天天给综看| 久久丫精品国产亚洲av不卡| 久久久精品国产Sm最大网站| 国产精品久久久久国产A级| 亚洲欧洲久久久精品| 久久成人精品视频| 亚洲va久久久噜噜噜久久狠狠| 久久久久国产精品麻豆AR影院| 久久国产精品77777| 久久精品免费全国观看国产| 91精品国产91热久久久久福利| 久久久久久无码Av成人影院| 超级碰碰碰碰97久久久久| 久久强奷乱码老熟女网站| 久久青青草原精品影院|