XNA SourceRectangle不在我想要的位置绘制纹理

时间:2012-12-17 14:49:31

标签: c# xna transparency texture2d rectangles

我遇到过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错误帖子,但直到现在我才找到一个可以理解的解决方案。

0 个答案:

没有答案