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

            最新隨筆

            搜索

            •  

            積分與排名

            • 積分 - 371315
            • 排名 - 67

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            天龍八部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
             // 以三角形的對(duì)角線鏡像,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;
                    
            // 版本號(hào)
                    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
                
            // 以三角形的對(duì)角線鏡像,IndexOrder==0時(shí)就把左上的紋理坐標(biāo)復(fù)制到右下,否則把右上的坐標(biāo)復(fù)制到左下
            #define FLIP_DIAGONAL 8

                
            // 單個(gè)網(wǎng)格信息
                struct GridInfo
                
            {
                    
            // 該值即為pixelmap的索引(第幾個(gè)pixelmap)
                    short    nFirstLayer;
                    
            // 對(duì)nFirstLayer的操作,取值是上面幾個(gè)定義的宏,可以互相組合
                    BYTE    nFirstLayerOp;
                    
            // 該值為pixelmap的索引
                    
            //天龍八部的地表最多可以兩層融合,說白了就是每個(gè)點(diǎn)里有兩層UV,這里為第二層pixelmap的索引
                    short    nSecondLayer;
                    
            // 對(duì)nSecondLayer的操作,取值同nFirstLayerOp
                    BYTE    nSecondLayerOp;
                    
            // 對(duì)格子的三角形的操作,可能取值如下
                    
            //    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)格文件失敗:" + fileName, 
                            
            "GridInfos::open");
                        
            return ; 
                    }

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

                    
            bool largeVersion = false;
                    
            // 看版本號(hào)大于這個(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();
                }



            }
            ;

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

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




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

            Feedback

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

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

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

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

            # 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ù)  更多評(píng)論
              

            久久99国产精品尤物| 国产精品久久久久影院色| 中文字幕精品久久久久人妻| 深夜久久AAAAA级毛片免费看| 亚洲愉拍99热成人精品热久久| 无码精品久久久天天影视| 久久国产精品免费一区| 亚洲精品乱码久久久久久蜜桃不卡 | 久久亚洲国产精品一区二区| 久久精品国产亚洲Aⅴ香蕉| 色婷婷综合久久久久中文一区二区| 国产精品激情综合久久| 久久精品午夜一区二区福利| 日本亚洲色大成网站WWW久久| 久久人人爽人人爽人人片av高请| 久久亚洲中文字幕精品一区| 久久er国产精品免费观看2| 久久中文字幕人妻熟av女| 九九久久精品国产| 欧美精品一本久久男人的天堂| 亚洲va久久久噜噜噜久久狠狠| 亚洲精品国精品久久99热| 国产呻吟久久久久久久92| 2021久久国自产拍精品| 欧美牲交A欧牲交aⅴ久久| 99久久99久久精品国产片果冻| 亚洲国产成人乱码精品女人久久久不卡| 久久精品一区二区国产| 国产成人精品白浆久久69| 日日躁夜夜躁狠狠久久AV| 亚洲精品午夜国产VA久久成人| 欧美黑人激情性久久| 久久亚洲国产成人影院| 亚洲人成无码网站久久99热国产| 久久精品国产亚洲av瑜伽| 国产精品久久久久久久久久免费| 久久国产精品久久国产精品| AV无码久久久久不卡网站下载| 97久久精品无码一区二区 | 国产成人精品久久一区二区三区| 亚洲乱码精品久久久久.. |