1

我遇到过 XNA 的情况,sourceRectangle即它如何在屏幕上显示纹理的一部分。

假设我有 2 个简单的形状纹理 - 一个正方形和一个圆形。圆圈位于正方形内部。圆的位置由 Mathhelper.Lerp(在正方形内,在正方形外,浮点 x)驱动。如果圆形纹理往下走,它会到达正方形的底部边缘并逐渐消失,就像到达实际游戏屏幕的底部边缘一样。sourceRectangle在这种情况下工作正常。

当圆圈上升并到达正方形的顶部边缘时,就会出现问题。假设圆形纹理位于正方形顶部边缘的中间。在这种情况下,我只想显示圆圈的下半部分。当我告诉sourceRectangle只绘制下半部分时,sourceRectangle会绘制下半部分,它会在圆形纹理的上半部分重新绘制该部分。结果,我将圆的下半部分绘制在正方形的上边缘上方,这不是预期的效果。

我得出的结论 sourcerectangle 确实占用了您想要绘制的纹理区域,但首先在纹理顶部绘制(或定位)您想要的区域。sourcerect(在这种情况下)是否有从底部开始绘制的解决方法,或任何其他选项?

我已经尝试过 Texture2d.SetData 路由来使像素行透明。那行得通,但是我必须将 graphicsdevice[0] 设置为 null,而且我不知道如何取回该纹理(或使其再次显示在屏幕上)。每次 Lerp 将纹理推过正方形的顶部边缘时,我都尝试将纹理重新定位在正方形顶部边缘的正下方,但动画会变得“看起来很不稳定”。

手绘 Sourcerect 描述链接

解决

我想出了一个非常适合我需求的解决方案。在我原来的帖子中,我说过我尝试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这里注意到了类似的错误帖子,但直到现在我才找到可以理解的解决方案。

4

0 回答 0