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

            游戲開發 C++ Cocos2d-x OpenGL DirectX 數學 計算機圖形學 SQL Server

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

            公告

            QQ:30743734
            EMain:mybios@qq.com

            常用鏈接

            留言簿(16)

            我參與的團隊

            最新隨筆

            搜索

            •  

            積分與排名

            • 積分 - 372214
            • 排名 - 67

            最新評論

            閱讀排行榜

            評論排行榜

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

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

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

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

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


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

                    typedef std::vector
            <GridInfo> GridData;
                    
            // 網格信息數組
                    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();
                }


                
            // 打開網格文件
                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, 
                            
            "打開地形網格文件失敗:" + fileName, 
                            
            "GridInfos::open");
                        
            return ; 
                    }

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

                    
            bool largeVersion = false;
                    
            // 看版本號大于這個,就表示后面跟著有個標記用來表示結構體的大小是7字節的版本還是5字節的版本
                    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");

                }


                
            // 完畢并清空網格
                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();
                }



            }
            ;

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

            不如打賞我一杯咖啡,鼓勵我繼續分享優秀的文章。




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

            Feedback

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

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

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

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

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

            @開源人
            這里減一是因為天龍里的這個id是從1開始的,0就代表這層不使用。
            而c程序的數組索引是從0開始的,所以在載入時一次性減一,以便在使用的時候不需要再減一,而判斷這層是否使用就改成用-1來判斷,而不是原來的0。  回復  更多評論
              

            国产精品久久永久免费| 国产精自产拍久久久久久蜜| 国产A级毛片久久久精品毛片| 色欲av伊人久久大香线蕉影院| 亚洲精品国产字幕久久不卡| 日韩精品国产自在久久现线拍| 思思久久99热免费精品6| 久久亚洲AV成人出白浆无码国产| 精品久久久久久无码人妻蜜桃| 亚洲国产成人精品无码久久久久久综合| 波多野结衣AV无码久久一区| 久久久久无码专区亚洲av| 欧美大香线蕉线伊人久久| 久久久亚洲精品蜜桃臀| 国产精品女同久久久久电影院| 午夜精品久久久内射近拍高清| 国产成人久久激情91| 亚洲中文字幕无码久久精品1| 精品久久人人妻人人做精品| 久久综合中文字幕| 久久精品国产亚洲av影院| 一本色道久久88—综合亚洲精品| 亚洲精品国产自在久久| 久久精品成人欧美大片| 精品久久久久久久久久久久久久久| 精品久久香蕉国产线看观看亚洲| 亚洲精品无码专区久久久| 亚洲国产精品成人久久蜜臀| 亚洲精品99久久久久中文字幕| 精品久久人人爽天天玩人人妻| 国产精品成人精品久久久| 精品久久久久久中文字幕| 久久99精品久久久久久 | 久久精品九九亚洲精品天堂| 中文无码久久精品| 久久久久国产精品嫩草影院| 亚洲欧美精品一区久久中文字幕| 一本综合久久国产二区| 人人妻久久人人澡人人爽人人精品| 久久人妻AV中文字幕| 精品熟女少妇a∨免费久久|