2012-03-29 4 views
0
public void Draw(SpriteBatch spriteBatch) 
    { 
     for (int x = 0; x < width; x++) 
     { 
      for (int y = 0; y < height; y++) 
      { 
       Vector2 mouseCoord = GetMouseTilePosition(); 
       if (mouseCoord.X > 0) 
       { 
        spriteBatch.Draw(selection, tileRect = new Rectangle((int)mouseCoord.X * 64, (int)mouseCoord.Y * 64, 64, 64), 
            Color.White); 
       } 
       spriteBatch.Draw(tiles[index[x,y]].texture, tileRect = new Rectangle(x * 64, y * 64, 64, 64), 
        Color.White);   
      } 
     } 
    } 

    public Vector2 GetMouseTilePosition() 
    { 
     for (int x = 0; x < width; x++) 
     { 
      for (int y = 0; y < height; y++) 
      { 
       if (IsMouseInsideTile(x, y)) 
       { 
        return new Vector2(x, y); 
       } 
      } 
     } 

     return new Vector2(-1, -1); 
    } 

    public bool IsMouseInsideTile(int x, int y) 
    { 
     MouseState MS = Mouse.GetState(); 
     return (MS.X >= x * 64 && MS.X <= (x + 1) * 64 && 
      MS.Y >= y * 64 && MS.Y <= (y + 1) * 64); 
    } 

Это очень интенсивный процессор. Есть ли лучший способ сделать этот код? Также у меня есть камера, как я могу изменить это на коэффициент, поэтому я получаю фактическую позицию мыши.Выбор текстуры на плитах, вызывающих проблемы с производительностью

+0

Непонятно, что вы пытаетесь сделать. Что такое 'width' и' height'? Почему вы вызываете 'GetMouseTilePosition' (который перебирает * каждую * координату) на * каждую итерацию * в' Draw'? В принципе, да, я абсолютно уверен, что есть * намного более быстрые способы сделать это, но трудно давать предложения без дополнительного контекста. –

+0

Я просто не включил весь мой код. width = 17 height = 15. Мне сказали использовать GetMouseTilePosition в моем последнем вопросе, так что да, поэтому я использую это – Corey

+0

. Если честно, этот код выглядит довольно неэффективным для начала. Пока не совсем ясно, чего вы пытаетесь достичь. –

ответ

1

Jon Skeet прав, вы можете напрямую вызвать IsMouseInsideTile(), а не цикл через свой массив несколько раз. (В настоящее время вы проверяете, где мышь находится во всем массиве плитки, для каждой плитки, а не только для проверки текущей плитки, в которой вы находитесь).

public void Draw(SpriteBatch spriteBatch) 
{ 
    for (int x = 0; x < width; x++) 
    { 
     for (int y = 0; y < height; y++) 
     { 
      if (IsMouseInsideTile(x, y)) 
      { 
       spriteBatch.Draw(selection, tileRect = new Rectangle(x * 64, y * 64, 64, 64), 
            Color.White); 
      } 
      spriteBatch.Draw(tiles[index[x,y]].texture, tileRect = new Rectangle(x * 64, y * 64, 64, 64), 
        Color.White);   
     } 
    } 
} 

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

+0

Это круто. Еще один вопрос, если вы не возражаете ответить. Все, что я ищу в Интернете, о выборе мыши, говорит о том, чтобы использовать .contains или .intersects на прямоугольниках для вашей мыши и плитки. Считаете ли вы, что это лучший способ сделать это или придерживаться того, что вы мне дали? Я просто хочу сделать все, что будет оптимизировано в долгосрочной перспективе. – Corey

+0

Я предполагаю, что вы можете использовать .intersect, но я не думаю, что будет много разницы в производительности. Вам придется попробовать себя и посмотреть, не изменилось ли это. – Msonic