在XNA中绘制简单的圆圈

时间:2010-03-25 20:56:29

标签: c# xna

我想绘制一个2d,填充的圆圈。我到处寻找,似乎无法找到任何甚至可以远程帮助我绘制圆圈的东西。我只想在画布上指定高度,宽度和位置。

任何人都知道怎么做?

谢谢!

8 个答案:

答案 0 :(得分:11)

XNA通常不会想到可以绘制的画布。相反,你可以在你最喜欢的绘画程序中创建一个圆圈并将其渲染为精灵,或者在3D网格中创建一个系列顶点以近似圆形并渲染它。

答案 1 :(得分:8)

您还可以查看Jeff Weber在Farseer中使用的示例框架:
http://www.codeplex.com/FarseerPhysics

演示有一个动态纹理生成器,让他制作圆形和矩形(然后样本用作物理模拟的可视化)。您可以重复使用: - )

答案 2 :(得分:6)

有同样的问题,正如其他人已经建议你需要在其上绘制一个带有圆形纹理的正方形或矩形。下面是我创建圆形纹理运行时的方法。这不是最有效或最奇特的方式,但它确实有效。

Texture2D createCircleText(int radius)
{
    Texture2D texture = new Texture2D(GraphicsDevice, radius, radius);
    Color[] colorData = new Color[radius*radius];

    float diam = radius / 2f;
    float diamsq = diam * diam;

    for (int x = 0; x < radius; x++)
    {
        for (int y = 0; y < radius; y++)
        {
            int index = x * radius + y;
            Vector2 pos = new Vector2(x - diam, y - diam);
            if (pos.LengthSquared() <= diamsq)
            {
                colorData[index] = Color.White;
            }
            else
            {
                colorData[index] = Color.Transparent;
            }
        }
    }

    texture.SetData(colorData);
    return texture;
}

答案 3 :(得分:3)

开箱即用,XNA中不支持此功能。我假设你来自一些GDI背景,只是想看到屏幕上移动的东西。但在真实的游戏中,如果需要的话很少。

这里有一些有用的信息:

http://forums.xna.com/forums/t/7414.aspx

我给你的建议是点燃油漆或其他东西,然后自己创建基本形状并使用内容管道。

答案 4 :(得分:3)

似乎有一个使用像素着色器的解决方案 - http://www.xnainfo.com/resources.php?view=Code%20snippets

答案 5 :(得分:2)

另一个选项(如果你想使用更复杂的渐变画笔等)是绘制一个与屏幕对齐的四边形并使用像素着色器。

答案 6 :(得分:1)

我要解决的问题是绘制矩形纹理,使不包含圆形的矩形区域保持透明。您要检查数组中的点是否包含在从矩形中心开始的圆中。

使用彩色数据数组有点奇怪,因为它不是2D数组。我的解决方案是将一些2D阵列逻辑引入场景中。

public Texture2D GetColoredCircle(float radius, Color desiredColor)
    {
        radius = radius / 2;
        int width = (int)radius * 2;
        int height = width;

        Vector2 center = new Vector2(radius, radius);

        Circle circle = new Circle(center, radius,false);

        Color[] dataColors = new Color[width * height];
        int row = -1; //increased on first iteration to zero!
        int column = 0;
        for (int i = 0; i < dataColors.Length; i++)
        {
            column++;
            if(i % width == 0) //if we reach the right side of the rectangle go to the next row as if we were using a 2D array.
            {
                row++;
                column = 0;
            }
            Vector2 point = new Vector2(row, column); //basically the next pixel.
            if(circle.ContainsPoint(point))
            {
                dataColors[i] = desiredColor; //point lies within the radius. Paint it.
            }
            else
            {
                dataColors[i] = Color.Transparent; //point lies outside, leave it transparent.
            }
            
        }
        Texture2D texture = new Texture2D(GraphicsDevice, width, height);
        texture.SetData(0, new Rectangle(0, 0, width, height), dataColors, 0, width * height);
        return texture;
    }

这是检查圆中是否包含点的方法:

 public bool ContainsPoint(Vector2 point)
    {
        return ((point - this.Center).Length() <= this.Radius);
    }

希望这会有所帮助!

答案 7 :(得分:0)

 public Texture2D createCircleText(int radius, GraphicsDevice Devise,Color color,int tickenes)
    {
        Texture2D texture = new Texture2D(Devise, radius, radius);
        Color[] colorData = new Color[radius * radius];
        if (tickenes >= radius) tickenes = radius - 5;
        float diam = radius / 2f;
        float diamsq = diam * diam;
        float intdiam = (radius-tickenes) / 2f;
        float intdiamsq = intdiam * intdiam;

        for (int x = 0; x < radius; x++)
        {
            for (int y = 0; y < radius; y++)
            {
                int index = x * radius + y;
                Vector2 pos = new Vector2(x - diam, y - diam);
                if (pos.LengthSquared() <= diamsq)
                {
                    colorData[index] = color;
                }
                else
                {
                    colorData[index] = Color.Transparent;
                }
                if (pos.LengthSquared() <= intdiamsq)
                {
                    colorData[index] = Color.Transparent; 
                }
            }
        }

        texture.SetData(colorData);
        return texture;
    }