我遇到过XNA的sourceRectangle
关于如何在屏幕上显示纹理部分的情况。
假设我有2个简单的形状纹理 - 正方形和圆形。圆圈位于正方形内。圆圈的位置正在被驱动
Mathhelper.Lerp(在广场内,广场外,浮动x)。如果圆形纹理下降,它将到达方形的底部边缘并逐渐消失,就像它到达实际游戏屏幕的底部边缘一样。 sourceRectangle
在这种情况下可以正常工作。
当圆圈上升并到达正方形的上边缘时,会出现问题。假设圆形纹理位于正方形顶部边缘的中间位置。在这种情况下,我只想显示圆圈的下半部分。当我告诉sourceRectangle
只绘制下半部分时,sourceRectangle
确实绘制了下半部分,但是它会在圆形纹理的上半部分重绘该部分。因此,我将圆圈的下半部分绘制在方形顶部边缘上方,这不是所需的效果。
我得出的结论是,sourcerectangle确实采用了你想要绘制的纹理区域,但是首先在纹理顶部绘制(或定位)你想要的区域。是否有sourcerect(在这种情况下)从底部开始绘制或任何其他选项的解决方法?
我尝试过Texture2d.SetData路径,使像素行透明。这是有效的,但我不得不将graphicsdevice [0]设置为null,我不知道如何恢复该纹理(或让它再次显示在屏幕上)。每次Lerp将纹理推到正方形的上边缘时,我都尝试将纹理重新定位在正方形的上边缘下方,但动画变得“看起来不稳定”。
Handdrawn Sourcerect Description Link
解决
我找到了一个非常适合我需求的解决方案。在我的原始帖子中,我说过我尝试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
错误帖子,但直到现在我才找到一个可以理解的解决方案。