2010-05-08 19 views
7

Quiero dividir mi cuadrícula de juego en una matriz de rectángulos. Cada rectángulo es 40x40 y hay 14 rectángulos en cada columna, con un total de 25 columnas. Esto cubre un área de juego de 560x1000.Mostrar rectángulos en la ventana del juego con XNA

Este es el código que he levantado para hacer la primera columna de rectángulos en la parrilla de juego:

Rectangle[] gameTiles = new Rectangle[15]; 

for (int i = 0; i <= 15; i++) 
{ 
    gameTiles[i] = new Rectangle(0, i * 40, 40, 40); 
} 

Estoy bastante seguro de que esto funciona, pero por supuesto no puedo confirmar porque rectángulos no lo hacen renderizar en la pantalla para que los vea físicamente. Lo que me gustaría hacer con fines de depuración es hacer un borde, o llenar el rectángulo con el color para que pueda verlo en el juego, solo para asegurarse de que esto funcione.

¿Hay alguna manera de que esto suceda? ¿O de forma relativamente simple, puedo asegurarme de que esto funcione?

Muchas gracias.

Respuesta

23

En primer lugar, hacer una textura de 1x1 píxeles de color blanco para el rectángulo:

var t = new Texture2D(GraphicsDevice, 1, 1); 
t.SetData(new[] { Color.White }); 

Ahora, es necesario hacer que el rectángulo - asuma el rectángulo se llama rectangle. Para renderizar un bloque relleno, es muy simple: asegúrese de configurar el tinte Color para que sea del color que desee. Simplemente use este código:

spriteBatch.Draw(t, rectangle, Color.Black); 

Para un borde, es más complejo. Tienes que dibujar las 4 líneas que componen el esquema (el rectángulo aquí es r):

int bw = 2; // Border width 

spriteBatch.Draw(t, new Rectangle(r.Left, r.Top, bw, r.Height), Color.Black); // Left 
spriteBatch.Draw(t, new Rectangle(r.Right, r.Top, bw, r.Height), Color.Black); // Right 
spriteBatch.Draw(t, new Rectangle(r.Left, r.Top, r.Width , bw), Color.Black); // Top 
spriteBatch.Draw(t, new Rectangle(r.Left, r.Bottom, r.Width, bw), Color.Black); // Bottom 

espero que ayude!

+1

+1 Gran respuesta. ¡Era exactamente lo que estaba buscando! Gracias –

+0

+1 corto y exactamente lo que necesitaba. – FRoZeN

0

Esto funcionó perfecto si desea dibujar rectángulos sobre las texturas existentes. Muy bien cuando se desea probar/ver por colisiones

http://bluelinegamestudios.com/blog/posts/drawing-a-hollow-rectangle-border-in-xna-4-0/

----- ----- desde el sitio

El truco básico para dibujar formas es hacer un solo píxel textura que es blanca, que luego puede mezclar con otros colores y mostrar en formas sólidas.

// At the top of your class: 
Texture2D pixel; 

// Somewhere in your LoadContent() method: 
pixel = new Texture2D(GameBase.GraphicsDevice, 1, 1, false, SurfaceFormat.Color); 
pixel.SetData(new[] { Color.White }); // so that we can draw whatever color we want on top of it 

Luego, en el método draw() hacer algo como:

spriteBatch.Begin(); 

// Create any rectangle you want. Here we'll use the TitleSafeArea for fun. 
Rectangle titleSafeRectangle = GraphicsDevice.Viewport.TitleSafeArea; 

// Call our method (also defined in this blog-post) 
DrawBorder(titleSafeRectangle, 5, Color.Red); 

spriteBatch.End(); 

Y el método real que realiza el dibujo:

private void DrawBorder(Rectangle rectangleToDraw, int thicknessOfBorder, Color borderColor) 
{ 
    // Draw top line 
    spriteBatch.Draw(pixel, new Rectangle(rectangleToDraw.X, rectangleToDraw.Y, rectangleToDraw.Width, thicknessOfBorder), borderColor); 

    // Draw left line 
    spriteBatch.Draw(pixel, new Rectangle(rectangleToDraw.X, rectangleToDraw.Y, thicknessOfBorder, rectangleToDraw.Height), borderColor); 

    // Draw right line 
    spriteBatch.Draw(pixel, new Rectangle((rectangleToDraw.X + rectangleToDraw.Width - thicknessOfBorder), 
            rectangleToDraw.Y, 
            thicknessOfBorder, 
            rectangleToDraw.Height), borderColor); 
    // Draw bottom line 
    spriteBatch.Draw(pixel, new Rectangle(rectangleToDraw.X, 
            rectangleToDraw.Y + rectangleToDraw.Height - thicknessOfBorder, 
            rectangleToDraw.Width, 
            thicknessOfBorder), borderColor); 
}