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);
    }

Es muy intensivo en CPU. ¿Existe una mejor manera de hacer este código? También tengo una cámara, ¿cómo puedo cambiar esto para tener en cuenta eso para obtener la posición real del mouse?

0
Corey 29 mar. 2012 a las 23:33
No está claro lo que intentas hacer. ¿Qué son width y height? ¿Por qué llamas a GetMouseTilePosition (que recorre cada coordenada) en cada iteración dentro de Draw? Básicamente, sí, estoy absolutamente seguro de que hay mucho formas más rápidas de hacer esto, pero es difícil dar sugerencias sin más contexto.
 – 
Jon Skeet
29 mar. 2012 a las 23:39
Simplemente no incluí todo mi código. width = 17 height = 15. Me dijeron que usara GetMouseTilePosition en mi última pregunta, así que sí, es por eso que estoy usando eso
 – 
Corey
29 mar. 2012 a las 23:43
Para ser honesto, ese código parece bastante ineficiente para empezar. Todavía no está muy claro qué está tratando de lograr.
 – 
Jon Skeet
29 mar. 2012 a las 23:56
Es un motor de mosaico simple con bucles for anidados. ¿Cómo es eso ineficiente? Estoy tratando de obtener una textura de selección cuadrada del mosaico sobre el que se encuentra actualmente mi mouse. Ya no entiendo cómo explicar eso.
 – 
Corey
30 mar. 2012 a las 00:06
¿Cómo es eso ineficiente? Bueno, estás ejecutando el ciclo más interno 15 * 17 * 15 * 17 = 65025 veces. Me suena bastante ineficaz, en comparación con lo que sospecho que se requiere. No ha explicado en esta pregunta qué mosaicos tiene, ni siquiera qué clase es esta. ¿Es una representación de un solo mosaico o hay varios mosaicos dentro de esta clase? ¿Qué quieres decir con "textura de selección cuadrada", exactamente ? Lea tinyurl.com/so-hints.
 – 
Jon Skeet
30 mar. 2012 a las 00:17

1 respuesta

La mejor respuesta

Jon Skeet tiene razón, podría llamar directamente a IsMouseInsideTile () en lugar de recorrer su matriz varias veces. (Actualmente, está verificando dónde está el mouse en toda la matriz de mosaicos, para cada mosaico, en lugar de solo verificar el mosaico actual en el que se encuentra).

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);          
        }
    }  
}

Lo siento, todo es culpa mía, envié este código rápidamente antes sin verificarlo dos veces. Esta nueva versión debería mejorar drásticamente su rendimiento.

1
Msonic 30 mar. 2012 a las 00:26
Es genial. Una pregunta más si no le importaría responder. Todo lo que busco en línea sobre la selección del mouse dice que use .contains o .intersects en rectángulos para su mouse y mosaicos. ¿Crees que sería una mejor manera de hacerlo o seguir con lo que me diste? Solo quiero hacer lo que sea más optimizado a largo plazo.
 – 
Corey
30 mar. 2012 a las 04:56
Supongo que podrías usar .intersect, pero no creo que haya mucha diferencia en cuanto al rendimiento. Tendrías que probarlo tú mismo y ver si hay alguna diferencia.
 – 
Msonic
30 mar. 2012 a las 17:40