我遇到过 XNA 的情况,sourceRectangle
即它如何在屏幕上显示纹理的一部分。
假设我有 2 个简单的形状纹理 - 一个正方形和一个圆形。圆圈位于正方形内部。圆的位置由 Mathhelper.Lerp(在正方形内,在正方形外,浮点 x)驱动。如果圆形纹理往下走,它会到达正方形的底部边缘并逐渐消失,就像到达实际游戏屏幕的底部边缘一样。sourceRectangle
在这种情况下工作正常。
当圆圈上升并到达正方形的顶部边缘时,就会出现问题。假设圆形纹理位于正方形顶部边缘的中间。在这种情况下,我只想显示圆圈的下半部分。当我告诉sourceRectangle
只绘制下半部分时,sourceRectangle
会绘制下半部分,但它会在圆形纹理的上半部分重新绘制该部分。结果,我将圆的下半部分绘制在正方形的上边缘上方,这不是预期的效果。
我得出的结论 sourcerectangle 确实占用了您想要绘制的纹理区域,但首先在纹理顶部绘制(或定位)您想要的区域。sourcerect(在这种情况下)是否有从底部开始绘制的解决方法,或任何其他选项?
我已经尝试过 Texture2d.SetData 路由来使像素行透明。那行得通,但是我必须将 graphicsdevice[0] 设置为 null,而且我不知道如何取回该纹理(或使其再次显示在屏幕上)。每次 Lerp 将纹理推过正方形的顶部边缘时,我都尝试将纹理重新定位在正方形顶部边缘的正下方,但动画会变得“看起来很不稳定”。
解决
我想出了一个非常适合我需求的解决方案。在我原来的帖子中,我说过我尝试Texture2d.SetData()/GetData()
使正方形边界之外的像素透明。它一直有效,直到我收到一条错误消息,说我必须在设置纹理数据之前将 graphicsdevice 设置为 null。与此同时,我重新审视了它,它现在运行良好。
我的解决方案/错误:
Texture2D tempTex;
public Texture2d FormatTexture( Texture2D circleTex, int numOfRows)
{
tempTex = new Texture2d(GraphicsDevice, circleTexture.Width, circleTexture.Height)
//Each index in pixels[] will hold Color(r,g,b) data
Color[] pixels = new Color[circleTex.Width * circleTex.Height];
//Get every pixel's color info from the circle texture and store it in pixels[]
circleTex.GetData<Color>(pixels);
//Only edit the desired number of rows in the texture, not the entire texture
for(int i = 0; i < circleTex.Width * numOfRows; i++)
{
//make pixel transparent via multiplying it by 0
pixels[i] = pixels[i] * 0;
}
//Bypass that graphicsdevice[0] = null error by setting data on a texture not
//currently using spritebatch (tempTex instead of circleTex)
tempTex.SetData<Color>(pixels);
return tempTex;
}
我之前做错的是试图设置circleTexture
数据。显然,当它仍在图形设备上时,您不能这样做。相反,我创建了一个不在 spritebatch“tempTex”上的新纹理,它基本上circleTexture
是透明的行。我在T2D.SetData
这里注意到了类似的错误帖子,但直到现在我才找到可以理解的解决方案。