HGE中的Texture操作

HGE是一款很不错的2D游戏引擎,对于游戏引擎的入门是很不错的选择。

前段时间把HGE重新封装了下,好符合自己的使用习惯。在封装的过程中,遇到一些对Texture的操作,卡了很久,在此记录遇到的问题,以备查阅,希望也能给你带来帮助,


Texture函数列表

  1. Texture_Create:创建一个空纹理,可以指定高度宽度,但是创建后的纹理大小可能比指定的宽度高度大,原因暂时还不知道,可能是DX的原因,希望有了解的可以告知;
  2. Texture_Load:载入一个纹理,从资源文件载入数据,然后转化成纹理;
  3. Texture_Free:释放纹理
  4. Texture_GetWidth:获取纹理宽度,实际宽度,可能与自己指定的纹理宽度不同,如果要对纹理做操作,需要使用这个宽度;
  5. Texture_GetHeight:获取纹理高度,实际高度,可能与自己指定的纹理高度不同,如果要对纹理做操作,需要使用这个高度;
  6. Texture_Lock:锁定纹理,并返回锁定的纹理区域的第一个像素点的数据指针;
  7. Texture_Unlock:解锁纹理,与上面的Lock配合使用。

Texture函数注意点

最主要的也最麻烦的是Texture_Lock,这个函数可以指定锁定的区域,可以指定锁定为只读。返回的是所指定的锁定区域的第一个像素点的数据指针。
比如图片数据如下:
x x x x
x x x x
x x x x
DWORD *pData = hge->Texture_Lock(tex, false, 1, 1, 2, 2);
锁定以后,图片数据如下:
x x x x
x x x x
x x x x
红色与绿色为锁定部分,绿色为pData所指向的像素点。此时,可以通过pData指针,对tex的数据进行操作。
如果要操作绿色数据下一行的数据,需要先获取tex宽度, 注意,这里必须要获取宽度,因为宽度可能与自己指定的不一致
int nWidth = hge->Texture_GetWidth(tex); //获取宽度 获取整个tex的宽度
DWORD *pNextLine = pData[nWidth]; //获取下一行的点 这里的偏移必须是整个tex的宽度,而不是当前锁定区域的宽度
此时,pNextLine就指向了绿色数据下一行的那个像素点。
推测:根据上面的操作, 大致推测了下,应该是Texture_Lock只是指定了锁定哪一块区域,而不是截取了一块区域,所以在换行的时候, 偏移必须是整个tex的宽度

下面是一个将texSrc的10,10开始,20*0的区域拷贝到texDest上的0,0开始的20*30的区域的例子:
		//获取的宽度和实际宽度不一定是一样的
		int nTexSrcW  = Hge->Texture_GetWidth(texSrc);
		int nTexDestW = Hge->Texture_GetWidth(texDest);
		int nStX = 10;	//开始Copy的数据的x位置
		int nStY = 10;	//开始Copy的数据的y位置
		int nSizeW = 20;	//Copy数据区域的宽度
		int nSizeH = 30;	//Copy数据区域的高度
		//获取需要的 数据区域
		DWORD *pdwDataDest = Hge->Texture_Lock(m_tex, false);
		DWORD *pdwDataSrc  = Hge->Texture_Lock(texSrc, true, nStX, nStY, nSizeW, nSizeH);	//Copy texSrc的10,10开始 20*30大小的数据区域
		//开始Copy
		for (int i = 0; i < nSizeH; i++)
		{
			for (int j = 0; j < nSizeW; j++)
			{
				pdwDataDest[i*nTexDestW + j] = pdwDataSrc[i*nTexSrcW + j];	//Copy 注意是nTexSrcW而不是nSizeW
			}
		}
		Hge->Texture_Unlock(texSrc);	//释放
		Hge->Texture_Unlock(texDest);

你可能感兴趣的:(HGE中的Texture操作)