2D XNA - 绘制圆

时间:2016-01-16 21:40:54

标签: c# xna

哟,大家好嗨

有没有办法画圆圈?我不想使用纹理/精灵来画一个圆圈因为玩家是圆圈所以圆圈应该移动......而且我也试图让它变成玩家/圆圈'尺寸变得越来越大当他吃一些食物blablabla ...

无论如何,如果有人知道该怎么做请告诉我。

其他方式:有改变纹理高度/宽度的方法,然后我将制作一个简单的圆形纹理并改变它的高度/宽度。

感谢。

2 个答案:

答案 0 :(得分:1)

您可以使用3D原语,如“某人”等。产品:>已发布或使用C3.XNA.Primitives2D库,您可以使用SpriteBatch的扩展来绘制圆圈

public static void DrawCircle(this SpriteBatch spriteBatch, Vector2 center, float radius, int sides, Color color, float thickness);

如果对半径和厚度使用相同的值,则圆圈显示为填充。 我没有找到offizial下载链接,但也有sourceforge上传。

您还可以通过以下代码动态生成圆圈:

public static Texture2D GenerateCircleTexture(GraphicsDevice graphicsDevice, int radius, Color color, float sharpness)
    {
        int diameter = radius * 2;
        Texture2D circleTexture = new Texture2D(graphicsDevice, diameter, diameter, false, SurfaceFormat.Color);
        Color[] colorData = new Color[circleTexture.Width * circleTexture.Height];
        Vector2 center = new Vector2(radius);
        for (int colIndex = 0; colIndex < circleTexture.Width; colIndex++)
        {
            for (int rowIndex = 0; rowIndex < circleTexture.Height; rowIndex++)
            {
                Vector2 position = new Vector2(colIndex, rowIndex);
                float distance = Vector2.Distance(center, position);

                // hermite iterpolation
                float x = distance / diameter;
                float edge0 = (radius * sharpness) / (float)diameter;
                float edge1 = radius / (float)diameter;
                float temp = MathHelper.Clamp((x - edge0) / (edge1 - edge0), 0.0f, 1.0f);
                float result = temp * temp * (3.0f - 2.0f * temp);

                colorData[rowIndex * circleTexture.Width + colIndex] = color * (1f - result);
            }
        }
        circleTexture.SetData<Color>(colorData);

        return circleTexture;
    }

低于1f的清晰度使圆圈模糊。

答案 1 :(得分:0)

绘制图元(例如圆圈)的唯一方法是3D: https://msdn.microsoft.com/en-us/library/bb196414.aspx

或者你可以加载一个1 * 1的纹理,将它拉伸成一条线然后用一堆这些线来制作一个圆圈。 使用:

public void Draw (
         Texture2D texture,
         Vector2 position,
         Nullable<Rectangle> sourceRectangle,
         Color color,
         float rotation,
         Vector2 origin,
         Vector2 scale,
         SpriteEffects effects,
         float layerDepth
)

拉伸纹理。

或者你可以使用圆形纹理并拉伸它。

如果您正在制作像agar.io这样的东西,那么您可能希望使用与圆基元结合的纹理,这样您就可以使圆圈“摇摆不定”。