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

李錦俊(mybios)的blog

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

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

公告

QQ:30743734
EMain:mybios@qq.com

常用鏈接

留言簿(16)

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

最新隨筆

搜索

  •  

積分與排名

  • 積分 - 373303
  • 排名 - 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) 閱讀(5260) 評(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é)下。。中國(guó)程序員太保守。  回復(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)論
  

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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久久久精品视频| 亚洲欧洲一区二区三区| 国产三级精品在线不卡| 国产精品视频1区| 国产欧美日韩视频在线观看| 国产日韩精品在线| 亚洲高清精品中出| 亚洲美女福利视频网站| 亚洲精品在线免费| 夜夜精品视频一区二区| 欧美一二区视频| 蜜桃久久av一区| 亚洲人成人一区二区在线观看| 99精品国产在热久久下载| 亚洲手机视频| 在线看一区二区| 国产精品久久一级| 黄色一区二区三区四区| 亚洲福利视频二区| 宅男66日本亚洲欧美视频| 午夜性色一区二区三区免费视频| 久久精品国产清高在天天线| 欧美激情欧美狂野欧美精品| 这里只有精品视频在线| 久久五月婷婷丁香社区| 国产精品99一区| 亚洲国产日韩在线一区模特| 亚洲一区二区三区精品在线| 免费一级欧美片在线播放| 亚洲视频一区二区| 欧美激情bt| 激情综合色综合久久| 亚洲一区二区三区四区视频| 欧美jjzz| 欧美有码视频| 欧美日韩免费视频| 亚洲激情电影在线| 久久国产高清| 亚洲午夜久久久| 欧美美女bb生活片| 亚洲国产精品美女| 久久婷婷国产综合精品青草| 中文国产成人精品| 欧美理论视频| 亚洲国产婷婷| 米奇777在线欧美播放| 亚洲欧美伊人| 国产精品亚洲产品| 亚洲一级特黄| 亚洲国产美女| 久久亚洲色图| 激情欧美亚洲| 久久精品91| 午夜精品999| 国产欧美精品一区aⅴ影院| 亚洲综合色婷婷| 亚洲视频在线二区| 国产精品对白刺激久久久| 在线亚洲高清视频| 99re6热只有精品免费观看| 欧美高清视频免费观看| 亚洲欧洲精品一区二区三区| 欧美电影免费观看高清完整版 | 欧美高清一区| 久久天堂成人| 午夜精品一区二区三区四区 | 欧美亚洲一区三区| 午夜免费电影一区在线观看| 国产精品久久久久久久久| 亚洲一区二区三区欧美 | 一区电影在线观看| 欧美黄色视屏| 亚洲视频大全| 亚洲午夜精品久久久久久app| 国产精品女主播一区二区三区| 翔田千里一区二区| 欧美一级专区| 亚洲成人在线| 亚洲欧洲日产国产网站| 欧美揉bbbbb揉bbbbb| 亚洲欧美日韩精品久久久久| 亚洲欧美日韩另类| 亚洲国产另类久久精品| 最近中文字幕日韩精品| 欧美深夜影院| 久久亚洲欧洲| 欧美v国产在线一区二区三区| 一区二区高清视频在线观看| 一区二区三区高清在线| 国产欧美91| 亚洲电影免费在线| 国产精品国产三级国产普通话蜜臀| 小黄鸭精品密入口导航| 久久久久久久网站| 一区二区欧美亚洲| 欧美一区二区三区啪啪| 亚洲日韩第九十九页| 亚洲中无吗在线| 亚洲第一福利在线观看| 亚洲理伦电影| 国产午夜精品全部视频在线播放 | 久久夜色精品国产欧美乱极品| 欧美大尺度在线观看| 亚洲欧美中文日韩v在线观看| 久久九九电影| 午夜精品久久久久久99热软件| 久久综合久久久久88| 亚洲欧美成人一区二区三区| 久久九九全国免费精品观看| 国产精品99久久久久久有的能看| 欧美一级大片在线观看| 亚洲调教视频在线观看| 免费人成精品欧美精品| 亚洲欧美视频在线| 欧美国产精品久久| 毛片av中文字幕一区二区| 国产精品欧美一区二区三区奶水 | 亚洲精品中文字幕有码专区| 午夜精品久久99蜜桃的功能介绍| 亚洲免费久久| 久久综合九色欧美综合狠狠| 欧美中文字幕在线播放| 国产精品videosex极品| 亚洲缚视频在线观看| 影音先锋亚洲视频| 亚洲理论电影网| 国产欧美一区二区精品性| 国语自产精品视频在线看一大j8 | 亚洲精品裸体| 亚洲电影av在线| 午夜欧美大尺度福利影院在线看| 99精品热视频只有精品10| 久久精品在线视频| 久久久噜噜噜久久中文字免| 国产精品亚洲аv天堂网| 亚洲一二三区在线| 午夜精品久久久久久久久| 国产精品黄页免费高清在线观看| 亚洲日本中文字幕| 亚洲免费电影在线观看| 免费在线观看日韩欧美| 欧美国产免费| 亚洲激情网址| 欧美r片在线| 亚洲区中文字幕| 一本色道久久精品| 欧美日韩国产成人| 一区二区三区精品国产| 亚洲欧美日韩国产综合| 国产欧美一区二区精品性色| 欧美一区二区三区四区夜夜大片| 久久国产精品一区二区三区| 国产综合在线视频| 久久亚洲捆绑美女| 亚洲精品中文字幕在线| 中文久久精品| 国产欧美精品日韩精品| 久久久精品免费视频| 美女精品自拍一二三四| 亚洲精品一二| 国产精品大片| 久久精品国产成人| 欧美成人高清视频| 亚洲亚洲精品三区日韩精品在线视频 | 国产精品99免费看| 久久精品国产99精品国产亚洲性色| 免费欧美日韩| 一区二区三区视频观看| 国产精品一区二区欧美| 久久久久久久波多野高潮日日| 亚洲电影天堂av| 亚洲欧美日韩另类精品一区二区三区 | 欧美福利视频一区| 一区二区动漫| 国产资源精品在线观看| 欧美激情综合在线| 亚洲欧美激情视频在线观看一区二区三区| 久久成人免费日本黄色| 日韩视频中文| 狠狠色综合网| 欧美视频手机在线| 久久久之久亚州精品露出| 日韩亚洲成人av在线| 久久综合网色—综合色88| 99精品福利视频| 在线观看欧美日韩| 国产精品网站在线观看| 一区二区av在线| 亚洲一区二区成人| 日韩视频免费| 国产女主播一区| 欧美精品免费视频| 香蕉成人啪国产精品视频综合网| 欧美黄色aa电影| 欧美亚洲自偷自偷| 一本色道久久99精品综合| 在线成人免费观看| 国产美女在线精品免费观看| 欧美18av| 久久久一二三|