1

我有一个问题,目前我似乎无法找到一个比我目前的想法更有效的解决方案。

我正在用 XNA 制作一个小游戏,它将有一个随机生成的移动路径,但我不知道如何分离线条上方和下方的纹理,因为线条是随机生成的。我希望这张图片可以解释这个问题:

在此处输入图像描述

所以这些行是随机添加的。我自己的想法是创建许多具有不同高度的矩形并将它们彼此相邻放置,但我认为这有点低效而且它也迫使我将线足够粗以使矩形可以更宽一点不仅仅是 1-2 像素,否则您可能会在线条附近看到一些“空”点。

如果有任何不清楚的地方,请随时提问,我会将其添加到问题中,但我认为我的问题应该足够清楚。

4

2 回答 2

2

您可以用透明像素替换不需要的像素:

//extract pixel data from texture
Texture2D topTexture = ...
Color[] topTextureData = new Color[topTexture.Width * topTexture.Height];
topTexture.GetData<Color>(topTextureData);

for(int x = 0; x < topTexture.Width; x++)
{
    //depending on how you represent lines, set transparent all the pixels at and below line
    //basically, for each x dimension, you find where the line is - you have to
    //write the method for getting this y, as I don't know how you represent lines
    int lineY = GetLineYAtThisX(x);

    //all the pixels at (and below) the line are set transparent
    for(int y = lineY; y < topTexture.Height; y++)
    {
        topTextureData[x + y * topTexture.Width] = Color.Transparent;
    }  
}

//save this data into another texture, so you don't ruin the original one.
Texture2D maskedTopTexture = new Texture2D(GraphicsDevice, topTexture.Width, topTexture.Height);
maskedTopTexture.SetData<Color>(topTextureData);

您甚至不必为底部的一个这样做,只需在其上方绘制顶部的一个。

于 2012-11-04T17:48:29.003 回答
1

这个问题的一个解决方案是创建一个遮罩纹理,它会遮盖所选区域之外的纹理。

狂技能来袭!

黑色区域不会被绘制。对其他纹理做相反的事情,你会得到你想要的。

我不确定如何使用 spritebatch,但您的问题的一般解决方案可能使用掩码。

于 2012-11-04T14:06:24.527 回答