Witam.
Piszę gierkę w XNA typu obrona wieży. Chciałem by ścieżka była budowana w inny sposób niż z nudnych gotowych kafelków. Wymyśliłem więc, że będę posługiwał się czymś w rodzaju tekstury pędzla, który na obiekcie typu RenderTarget2D narysuje mi piksele, z których potem chciałem brać tylko informację o ich widoczności (kanale alpha).
Tak wygląda tekstura pędzla (zapisana w PNG):
Ścieżkę chcę tworzyć mniej więcej w ten sposób:
Texture2D ground;
RenderTarget2D path;
Texture2D pathBrush;
//Tutaj w sekcji LoadContent
GraphicsDevice.SetRenderTarget(path);
spriteBatch.Begin(SpriteSortMode.Immediate, BlendState.AlphaBlend, SamplerState.PointClamp, null, null);
GraphicsDevice.Clear(Color.Transparent);
for (int i = 0; i < 15; i++)
{
spriteBatch.Draw(pathBrush, new Rectangle(i * 10, 50, 39, 39), new Rectangle(0, 0, 39, 39), Color.White, random.Next(), new Vector2(20, 20), SpriteEffects.None, 0.0f);
spriteBatch.Draw(pathBrush, new Rectangle(i * 10, random.Next(-7, 7) + 50, 59, 59), new Rectangle(0, 0, 39, 39), Color.White, random.Next(), new Vector2(20, 20), SpriteEffects.None, 0.0f);
}
spriteBatch.End();
GraphicsDevice.SetRenderTarget(null);
GraphicsDevice.Clear(Color.Transparent);
Potem gdy korzystam z path jako tekstury w metodzie Draw wszystko wydaje się być ok.
Problem pojawia się gdy chcę ten czarny kształt wypełnić kolorami tekstury.
Color[,] pathColor = TextureTo2DArray(path);
Color[,] groundColors = TextureTo2DArray(ground);
Color[] data = new Color[pathColor.GetLength(0) * pathColor.GetLength(1)];
for (int x = 0; x < pathColor.GetLength(0); x++)
{
for (int y = 0; y < pathColor.GetLength(1); y++)
{
data[x + y * pathColor.GetLength(0)] = groundColors[x%groundColors.GetLength(0), y%groundColors.GetLength(1)];
data[x + y * pathColor.GetLength(0)].A = pathColor[x, y].A;
if (pathColor[x, y].A == 0)
{
data[x + y * pathColor.GetLength(0)] = Color.Transparent;
}
}
}
path.SetData(data);
Wówczas efekt jest następujący (osiągnięty po lewej, zamierzony po prawej):
Czytałem o tym całym alpha belndingu, kombinowałem ale nic nie udało mi się zdziałać. Nie wiem gdzie może leżeć przyczyna.
Jakieś pomysły?