HGE是一款很不错的2D游戏引擎,对于游戏引擎的入门是很不错的选择。
前段时间把HGE重新封装了下,好符合自己的使用习惯。在封装的过程中,遇到一些对Texture的操作,卡了很久,在此记录遇到的问题,以备查阅,希望也能给你带来帮助,
Texture函数列表
- Texture_Create:创建一个空纹理,可以指定高度宽度,但是创建后的纹理大小可能比指定的宽度高度大,原因暂时还不知道,可能是DX的原因,希望有了解的可以告知;
- Texture_Load:载入一个纹理,从资源文件载入数据,然后转化成纹理;
- Texture_Free:释放纹理
- Texture_GetWidth:获取纹理宽度,实际宽度,可能与自己指定的纹理宽度不同,如果要对纹理做操作,需要使用这个宽度;
- Texture_GetHeight:获取纹理高度,实际高度,可能与自己指定的纹理高度不同,如果要对纹理做操作,需要使用这个高度;
- Texture_Lock:锁定纹理,并返回锁定的纹理区域的第一个像素点的数据指针;
- 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);