乱稿:PNGのデータ構造と伝統的なデータ構造


落書きしたもの:
 
// HellowTest2008.cpp :              。
//

#include "stdafx.h"
#include "CLock.h"

	/*
		V1      ,V2       
		   nVersion   0,     nVersion   1
	*/
struct Role1
{
	int V1n1;
	int V2n1;
};

struct Role2
{
	int V2n1;
	int V1n1;
};

class CRole
{
public:

private:

public:
	int V1n1;
	Role1 V1Role1;
	Role2 V1Role2;

	int V2n1;
	int V2n2;
	int V2n3;

private:

};

struct ChunkHead
{
	int nLen;
};

struct Chunk
{
	int nLen;
	int ChunkType;
	char Buffer;
	int CRC;
};

/*
	CSave                 
*/
class CSave
{
public:
	CSave();
	void V1Read(CRole *pRole);
	void V1Write(CRole *pRole);

	void V2Read(CRole *pRole);
	

private:

public:
	/*
		V1
	*/
	int nVersion;
	char Buffer[1024];

	/*
		V2
	*/
	char V2Buffer[1024];   //        ChunkHead|Chunk|Chunk|Chunk


private:

};

CSave::CSave()
{
	nVersion = 0;
}

void CSave::V1Read(CRole *pRole)
{
	/*
		BufferXXX           ,       
	*/
	if(0==nVersion)
	{
		pRole->V1n1 = BufferXXX;
		/*
			               ,     .           
		*/
		pRole->V1Role1.V1n1 = BufferXXX;
		pRole->V1Role1.V1n1 = BufferXXX;
	}

	/*
		   ,        。
		             ,
		1.       (     )
		2.     ,             
		3.      

		      ,       ,       ,                ,
		        0==nVersion    ,              。       ,             。

		      (     ),               (          ),     
		     ,       。

		      ,        ,             。           。    ,        
		read,write   。                .       ,             。       
		                    。

		           
	*/
	if(1==nVersion)
	{
		//   0==nVersion      
		pRole->V1Role1.V2n1 = BufferXXX;
		pRole->V2n1 = BufferXXX;
		//......
	}
	if( 2==nVersion )
	{
		//   1==nVersion 。。
		//......
	}

	/*
		                      。                            , 
		            ,                 。  ,BufferXXX      ,     
		                 。                  。        ,      
		               ,        。          ,               ,
		       ,                。            ,         d1,d2,d3...dn,
		                。             ,          ,          
		   。
		        ,                    ,          Role       。    
		                 ,       。
	*/
}

void CSave::V2Read(CRole *pRole)
{
	/*
		          Chunk   , 、          ,        
		HandleChunkType()  。
	*/
	int nHasLen = 0;
	while(ChunkHead.nLen>nHasLen)
	{
		switch(Chunk.ChunkType)
		{
			HandleChunkType();
		}

		nHasLen += Chunk.nLen;
	}
}

void CSave::V1Write(CRole *pRole)
{
	/*
		       ,            、     。       
	*/
}

int _tmain(int argc, _TCHAR* argv[])
{


	return 0;
}
 
しかし、PNGというフォーマットを組み合わせると、ゲームの中で何かをすることができます。たとえばフィールドを拡張する時、古い案は2-3点を修正しなければなりません。点を修正すれば十分です。
変更された2~3点には、データベースフィールド、SQL文、変数の読み込みが含まれます。中間部品があれば、もっと多く変化します。
いくつかの小さなテクニックを使って、これらの修正点を一つの関数に集中できます。だからPNGには大きな啓発があります。