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

李錦俊(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)

我參與的團隊

最新隨筆

搜索

  •  

積分與排名

  • 積分 - 373330
  • 排名 - 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) 閱讀(5260) 評論(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。  回復  更多評論
  

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            国产欧美日韩另类视频免费观看| 99视频精品免费观看| 亚洲精品视频一区二区三区| 亚洲成色精品| 亚洲精品欧美一区二区三区| 一区二区三区精品视频在线观看| 一区二区高清在线观看| 亚洲免费视频观看| 久久av免费一区| 免费亚洲婷婷| 亚洲国产成人精品视频| 欧美黄色小视频| 日韩视频二区| 午夜精品久久久久久| 久热爱精品视频线路一| 欧美日韩视频第一区| 国产欧美日韩综合| 亚洲人成77777在线观看网| 亚洲一区二区三区四区五区午夜| 久久手机精品视频| 亚洲毛片在线观看| 欧美在线影院| 欧美视频在线观看一区| 在线国产日韩| 亚洲性感激情| 午夜视频在线观看一区二区| 亚洲视频一区在线观看| 午夜精品一区二区三区电影天堂| 久久综合色一综合色88| 日韩一级免费观看| 久久久久国产精品厨房| 国产精品久久国产愉拍| 在线精品国产欧美| 欧美在线视频播放| 99国产精品久久| 久久综合图片| 国产午夜精品福利| 亚洲午夜激情网站| 亚洲电影第1页| 久久精品国产2020观看福利| 国产精品成人一区二区网站软件 | 日韩视频免费观看高清在线视频| 欧美在线视频免费播放| 日韩视频免费看| 欧美成人自拍| 亚洲第一黄色网| 久久久天天操| 亚洲欧美日韩国产综合精品二区| 欧美日韩视频在线第一区| 亚洲乱码国产乱码精品精可以看| 毛片一区二区三区| 欧美一级网站| 国产一区二区丝袜高跟鞋图片| 久久精品视频在线看| 国产一本一道久久香蕉| 一区二区三区 在线观看视频| 另类图片综合电影| 午夜亚洲伦理| 国产精品日韩在线播放| 亚洲视频专区在线| 亚洲国产精品悠悠久久琪琪| 久久精品国产免费观看| 国产亚洲精品久久久久久| 亚洲欧美日韩国产| 亚洲视频在线观看网站| 国产精品久久久久久久久久尿| 一区二区三区久久网| 中国av一区| 好看不卡的中文字幕| 亚洲天堂偷拍| 一区二区国产日产| 国产精品久久久久久五月尺| 亚洲欧美在线磁力| 午夜一区在线| 欧美影片第一页| 亚洲男女自偷自拍| 亚洲午夜精品国产| 国产伦精品一区二区三区在线观看 | 最新成人av在线| 亚洲午夜在线视频| 国产精品久久久一本精品| 亚洲在线不卡| 久久成人18免费网站| 亚洲欧洲在线免费| 亚洲图片你懂的| 国内精品久久国产| 亚洲国产一区二区a毛片| 欧美午夜激情在线| 久久免费精品视频| 欧美日本在线| 久久久国产精品一区| 欧美成人影音| 久久av一区二区| 欧美激情一区二区在线| 欧美一区二区视频免费观看| 快she精品国产999| 亚洲欧美一区在线| 欧美成人亚洲成人日韩成人| 欧美一区二区在线播放| 欧美国产日韩一区| 久久久久免费观看| 欧美午夜女人视频在线| 你懂的成人av| 国产精品专区第二| 亚洲精品一区二| 亚洲电影免费在线 | 久久久久国产精品人| 欧美人牲a欧美精品| 久久在精品线影院精品国产| 国产精品成人在线| 亚洲国产视频a| 国模 一区 二区 三区| 99视频精品全部免费在线| 在线观看亚洲专区| 欧美一级在线播放| 午夜国产欧美理论在线播放| 欧美激情精品久久久久久久变态| 久久久久国产精品一区二区| 国产精品久久久久久久免费软件| 91久久精品一区二区别| 亚洲国产精品va在看黑人| 欧美中文在线视频| 久久精品女人| 国产日韩欧美麻豆| 亚洲午夜av| 亚洲欧美久久久| 欧美少妇一区| 中国亚洲黄色| 亚洲欧美日韩天堂一区二区| 免播放器亚洲| 亚洲桃色在线一区| 牛牛影视久久网| 免费日韩一区二区| 国内久久精品| 欧美在线国产| 久久一区二区三区四区| 国外成人免费视频| 久久国产精品久久久久久| 久久成人一区| 国产亚洲精品久久久久婷婷瑜伽| 亚洲欧美另类国产| 久久精品一本久久99精品| 国产一区再线| 久久综合精品一区| 亚洲国产精品电影| 夜夜躁日日躁狠狠久久88av| 欧美日韩黄色大片| 亚洲一区二区三区精品在线 | 欧美成人一品| 亚洲美女黄网| 国产精品久久久久久久久免费桃花 | 日韩一级黄色av| 欧美视频三区在线播放| 亚洲在线播放电影| 久久久久久9999| 亚洲国产日韩在线一区模特| 欧美激情区在线播放| 一区二区三区四区蜜桃| 久久国产精品72免费观看| 一区二区亚洲欧洲国产日韩| 欧美成人一区二区| 亚洲一区影音先锋| 免费在线观看一区二区| 亚洲精品影视| 国产精品乱码妇女bbbb| 久久久久一区二区三区| 亚洲看片免费| 久久久久成人精品| 99国产一区| 国产欧美日韩一区二区三区在线观看 | 99re亚洲国产精品| 国产精品羞羞答答xxdd| 噜噜噜91成人网| 亚洲一二三区在线| 欧美激情国产日韩| 亚洲欧美综合v| 亚洲激情社区| 国产一区二区三区高清播放| 欧美韩日视频| 久久精品二区三区| 一区二区三区欧美视频| 欧美黄色aa电影| 久久激情视频| 亚洲午夜精品在线| 亚洲国产欧美精品| 国产亚洲人成网站在线观看| 欧美日韩视频不卡| 欧美成人亚洲成人日韩成人| 久久国内精品视频| 亚洲一区欧美一区| 亚洲精品中文字幕有码专区| 麻豆av一区二区三区| 午夜精品影院| 亚洲一级片在线看| 洋洋av久久久久久久一区| 亚洲国产视频直播| 亚洲国产小视频在线观看| 国产夜色精品一区二区av| 欧美日韩一区三区四区| 麻豆成人在线观看|