Выбор текстуры на плитках, вызывающий проблемы с производительностью - PullRequest
0 голосов
/ 29 марта 2012
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);
    }

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

1 Ответ

1 голос
/ 30 марта 2012

Джон Скит прав, вы можете напрямую вызывать 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);          
        }
    }  
}

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

...