开发者

I want to draw a grid on the Windows Phone 7 using XNA

开发者 https://www.devze.com 2023-03-10 13:58 出处:网络
I am trying to draw a grid on the screen of a Windows Phone; it will help me better position my sprites on the screen rather than guessing locations on the screen.

I am trying to draw a grid on the screen of a Windows Phone; it will help me better position my sprites on the screen rather than guessing locations on the screen.

I have found several examples of a grid (2d or 3d) using XNA 3.0, but unfortunately the architectures are different and so the code doesnt work in XNA 4.0

D开发者_开发技巧oes anyone have something that could work?

Thanks!


You can download a PrimitiveBatch class here http://create.msdn.com/en-US/education/catalog/sample/primitives and use the code below to generate an appropriate grid as a texture.

PrimitiveBatch primitiveBatch;
private Texture2D GenerateGrid(Rectangle destRect, int cols, int rows, Color gridColor, int cellSize)
{
    int w = (int)(cols * gridCellSize);
    int h = (int)(rows * gridCellSize);

    float uselessWidth = destRect.Width - w;
    float uselessHeigth = destRect.Height - h;

    Rectangle bounds = new Rectangle((int)(uselessWidth / 2) + destRect.X, (int)(uselessHeigth / 2) + destRect.Y, w, h);

    RenderTarget2D grid = new RenderTarget2D(GraphicsDevice, GraphicsDevice.Viewport.Width, GraphicsDevice.Viewport.Height);

    GraphicsDevice.SetRenderTarget(grid);
    GraphicsDevice.Clear(Color.Transparent);

    primitiveBatch.Begin(PrimitiveType.LineList);

    float x = bounds.X;
    float y = bounds.Y;

    for (int col = 0; col < cols + 1; col++)
    {
        primitiveBatch.AddVertex(new Vector2(x + (col * gridCellSize), bounds.Top), gridColor);
        primitiveBatch.AddVertex(new Vector2(x + (col * gridCellSize), bounds.Bottom), gridColor);
    }

    for (int row = 0; row < rows + 1; row++)
    {
        primitiveBatch.AddVertex(new Vector2(bounds.Left, y + (row * gridCellSize)), gridColor);
        primitiveBatch.AddVertex(new Vector2(bounds.Right, y + (row * gridCellSize)), gridColor);
    }
    primitiveBatch.End();

    GraphicsDevice.SetRenderTarget(null);
return grid;
}


One quick and dirty way you can do it (as it is for debugging the quicker the better) is to simply create a texture of a grid that is of the same resolution you are running your XNA game at (if you are running it at the same resolution as the phone, this will be 480x800). Most of the texture will simply be an alpha map and with grid lines of one pixel, you could create multiple resolutions or you can repeat a small texture of a single pixel cross dividing a section of the screen that is divisible by the resolution you are running at.

The draw method will be something as below and be called everyframe.

This code can declared inside your game class

Texture2D gridTexture;
Rectangle gridRectangle;

This code should be in your LoadContent method

//Best to use something like a png file
gridTexture = content.Load<Texture2D>("pathto/mygridtexture");
gridRectangle = new Rectangle(0,0,resolutionX,resolutionY);

This method should be called from your Draw method last to ensure it is on top assuming you are just using the standard spriteBatch.Begin() to render sprites (first if you are doing FrontToBack rendering).

public void DrawGrid()
{
    spriteBatch.Draw(gridTexture, gridRectangle, Color.White);
}

This grid will remain stationary throughout the running of your application and should be useful when trying to line up your UI or objects that have relative positions in your game.

HTH.


You may want to take a look at the XPF project by RedBadger. It enables you to use XAML style layout in an XNA project.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号