2D XNA - 画一个圆

本文关键字:一个 XNA 2D | 更新日期: 2023-09-27 18:30:43

哟,大家好

有什么办法画圆吗?我不想使用纹理/精灵来画一个圆,因为玩家是圆圈,所以圆圈应该移动......而且我也在努力使玩家/圈子的大小越来越大,当他吃一些食物时......

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

否则:有没有办法改变纹理高度/宽度,那么我将制作一个简单的圆形纹理并更改它的高度/宽度。

谢谢。

2D XNA - 画一个圆

您可以使用

3D基元,例如"某人":>已发布或使用 C3。新纳。基元2D库,您可以使用SpriteBatch的扩展名绘制圆

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

如果对半径和厚度使用相同的值,则圆将显示为填充。我没有找到官方下载链接,但在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 的清晰度会使圆圈变得模糊。

绘制基元(例如圆)的唯一方法是 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 的东西,那么你可能需要使用与圆形基元相结合的纹理,这样你就可以使圆形"摇摆不定"。