2014-09-28 5 views
0

Я работаю с C# и Monogame 3.2. В настоящее время я работаю над 2D-игрой, такой как Starbound, и мне нужно, чтобы блоки соединялись друг с другом, а когда нет, имеют некоторые причудливые границы. Что я делаю, так это то, что у меня есть текстура, которая покрывает все 32 * 32 изображения и пользовательскую функцию с именем trimImage, чтобы обрезать изображение, чтобы он имел фантастические границы. Но, мне нужно найти способ установить прозрачный пиксель в определенном пикселе в Texture2D, чтобы я мог сделать эту границу.Как заменить значение RGB на текстуру2D на моногейме?

http://i.imgur.com/dvh6sI6.png Посмотрите на фиолетовую грязь, я, басически, хочу, чтобы она обрезала изображение на что-то подобное, и когда к нему подключаются другие блоки, он будет подключаться.

Кто-нибудь знает, как или, по крайней мере, лучший способ сделать этот эффект «границы»? Благодарю.

Примечание: В моем классе отделки у меня действительно есть только некоторые комментарии, ничего больше.

+0

Не уверен, что это то, что вы пытаетесь сделать, но это может вам помочь: http://www.jgallant.com/auto-calculating-bounding-box-from-texture- в-monogame-XNA / – jgallant

ответ

0

Не уверен, что именно то, что вы хотите, чтобы ваши границы, чтобы выглядеть, но вы можете сделать замену цвета, как это с помощью Texture2D.GetData() функции:

private Color TRANSPARENT = Color.Transparent; 
private Color BAD_COLOR = Color.Purple; 
private const int DEVIATION = 10; 

public Texture2D trimImage(Texture2D texture) 
{ 
    /// Get the data from the original texture and place it in an array 
    Color[] colorData = new Color[texture.Width * texture.Height]; 
    texture.GetData<Color>(colorData); 

    /// Loop through the array and change the RGB values you choose 
    for (int x = 0; x < texture.Width; x++) 
    { 
     for (int y = 0; y < texture.Height; y++) 
     { 
      Color pixel = colorData[x * texture.Height + y]; 
      /// Check if the color is within the range 
      if (MathHelper.Distance(pixel.R, BAD_COLOR.R) < DEVIATION && 
       MathHelper.Distance(pixel.G, BAD_COLOR.G) < DEVIATION && 
       MathHelper.Distance(pixel.B, BAD_COLOR.B) < DEVIATION && 
       pixel.A != 0f) 
      { 
       /// Make that color transparent 
       pixel = TRANSPARENT; 
      } 
     } 
    } 

    /// Put the color array into the new texture and return it 
    texture.SetData<Color>(colorData); 
    return texture; 
} 

Будучи в состоянии сделать другую границу является просто вопрос об изменении параметров цикла и выборе соответствующих пикселей. Надеюсь, это поможет.