XNA меняет примерно 200 пикселей - PullRequest
0 голосов
/ 02 апреля 2012

Эй, ребята, я думал, что это будет 1 секунда, в настоящее время у меня есть набор плиток для 2d игры и в зависимости от местности, которую он называет этими наборами плиток.и наборы плиток имеют цветовую кодировку: розовый - это материал, а синий - это материал, примыкающий к плитке.

Пока что при изменении ландшафта или при загрузке я рисую плитки на экране и любые новые плитки по мере движения,это все хорошо и работает очень хорошо, но когда у меня есть около 50 плиток травы, которые нужно изменить с розового на зеленый, и 75 плиток грязи, которые нужно изменить с розового на серый, у меня возникает проблема.

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

плохо приведу пример кода, что я делаю

Color[] storePixels = new Color[50 * 50];

for(int y = 0; y < 100; y ++)
{
    for(int x = 0; x < 100; x++)
    {
         tileTexture[y,x].GetData(storePixels);

         for(int i = 0; i < storePixels.Length; i ++)
         {
              if(tileMaterial[y,x] == "DIRT")
              {
                  storePixels[i] = new Color(100,100,100);
              }
              if(tileMaterial[y,x] == "GRASS")
              {
                  storePixels[i] = new Color(0,255,0);
              }
        }
        tileTexture[y,x].SetData(storePixels);
    }
}

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

Пожалуйста, дайте мне знать, если вы знаете, почему это не работает, спасибо заВаше время и заранее спасибо :))

ОК!я понял, что я вызываю одно и то же изображение в моей папке с содержимым

for(int y = 0; y < 100; y ++)
{
    for(int x = 0; x < 100; x ++)
    {
         tileTexture[y,x] = Content.Load<Texture2D>("tile");
    }
}

, так что теперь мы узнаем, почему мы решаем проблему, когда я меняю Texture2D через SetData (), это фактически меняет эту плиткуТекстура напрямую и все, что ее вызывает, всегда будут изменены.

Я не могу вызвать ее в цикле, я вызываю ее только при запуске, я могу попытаться сохранить копию texture2D и затем изменить ее.

я не знаю, есть ли у кого-нибудь еще решения, чтобы помочь решить эту проблему?спасибо за ваше время :) 1021 *

Ответы [ 2 ]

0 голосов
/ 03 апреля 2012
for(int y = 0; y < 100; y++) 
{ 
    for(int x = 0; x < 100; x++) 
    { 
        spriteBatch.Draw(tileTexture[y,x],rectangle,Color.White);
    }
}

вот так я рисую свою сетку

0 голосов
/ 02 апреля 2012

Этот код плохая идея ...

Вы можете работать только с одной белой текстурой ...

WhiteTex = new Texture2D(GraphicsDevice,1,1);
WhiteTex.SetData<Color>(new Color[] {Color.White };

Вы можете рисовать плитки таким образом ...

Enum MaterialTypes { Dirt, Grass }
static readonly Dictionary<int, Color> MaterialTypeToColor = new Dictionary() { {0, new Color(100,100,100)}, {1, new Color(0,255,0) }};

for(int y = 0; y < 100; y ++)
{
    for(int x = 0; x < 100; x++)
    {            
         batch.Draw(whiteTex, new Rectangle(x*50,y*50, 50,50), null, (MaterialTypeToColor[ (int) tileMaterial[y,x]]);
    }
}
...