2D XNA - 画一个圆
本文关键字:一个 XNA 2D | 更新日期: 2023-09-27 18:30:43
哟,大家好
有什么办法画圆吗?我不想使用纹理/精灵来画一个圆,因为玩家是圆圈,所以圆圈应该移动......而且我也在努力使玩家/圈子的大小越来越大,当他吃一些食物时......
无论如何,如果有人知道如何做,请告诉我。
否则:有没有办法改变纹理高度/宽度,那么我将制作一个简单的圆形纹理并更改它的高度/宽度。
谢谢。
您可以使用
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 的东西,那么你可能需要使用与圆形基元相结合的纹理,这样你就可以使圆形"摇摆不定"。