2010-05-08 5 views
7

Ich möchte mein Spielraster in eine Reihe von Rechtecken aufteilen. Jedes Rechteck ist 40x40 und es gibt 14 Rechtecke in jeder Spalte mit insgesamt 25 Spalten. Dies umfasst einen Spielbereich von 560x1000.Anzeige von Rechtecken im Spielfenster mit XNA

Dies ist der Code, den ich eingerichtet haben, um die erste Spalte der Rechtecke auf dem Spielraster zu machen:

Rectangle[] gameTiles = new Rectangle[15]; 

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

Ich bin ziemlich sicher, das funktioniert, aber natürlich kann ich es nicht bestätigen, weil Rechtecken nicht tun render auf dem Bildschirm für mich, sie physisch zu sehen. Was ich zu Debugging-Zwecken tun möchte, ist, einen Rahmen zu rendern oder das Rechteck mit Farbe zu füllen, damit ich es im Spiel selbst sehen kann, um sicherzustellen, dass das funktioniert.

Gibt es eine Möglichkeit, dies zu erreichen? Oder kann ich auf relativ einfache Weise sicherstellen, dass das funktioniert?

Vielen Dank.

Antwort

23

zunächst eine 1x1-Pixel-Textur von weißen für das Rechteck machen:

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

Nun müssen Sie das Rechteck machen - davon ausgehen, das Rechteck rectangle genannt wird. Für ein Rendering eines gefüllten Blocks ist es sehr einfach - stellen Sie sicher, dass der Farbton Color auf die gewünschte Farbe eingestellt ist. Verwenden Sie einfach diesen Code:

Für eine Grenze, ist es komplexer. Sie haben die vier Linien zu zeichnen, die die Kontur bilden (das Rechteck hier ist 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 

Hoffe, es hilft!

+1

+1 Große Antwort. War genau das, wonach ich suchte! Danke –

+0

+1 kurz und genau was ich brauchte. – FRoZeN

0

Dies funktionierte perfekt, wenn Sie Rechtecke über Ihre vorhandenen Texturen zeichnen möchten. Schön, wenn Sie für Kollisionen

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

----- von Standort testen/sehen wollen -----

Der grundlegende Trick Zeichnen von Formen ist ein einzelnes Pixel zu machen Textur, die Weiß ist, die Sie dann mit anderen Farben mischen und in festen Formen anzeigen können.

// 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 

dann in deiner Draw() -Methode so etwas wie:

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

und die tatsächliche Methode, die die Zeichnung tut:

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