gpt4 book ai didi

c# - 创建圆角矩形 Texture2D

转载 作者:行者123 更新时间:2023-11-30 14:33:04 24 4
gpt4 key购买 nike

我正在构建一个带有对话框的游戏,我希望能够以与最终幻想系列非常相似的风格为框生成纹理(想想 Final Fantasy VII )。这是我目前所拥有的代码片段:

public class DialogBox
{
public Rectangle BoxArea { get; set; }
public List<Color> BoxColors { get; set; }
public List<Color> BorderColors { get; set; }
public int BorderThickness { get; set; }
public int BorderRadius { get; set; }
private Texture2D texture;

public void CreateBackdrop(ref GraphicsDevice graphics)
{
texture = new Texture2D(graphics,
BoxArea.Width,
BoxArea.Height,
true,
SurfaceFormat.Color);
Color[] color = new Color[texture.Width * texture.Height];

for(int x = 0; x < texture.Width; x++)
{
for(int y = 0; y < texture.Height; y++)
{
switch(BoxColors.Count)
{
case 4:
Color leftColor = Color.Lerp(BoxColor[0], BoxColor[1], (y / (texture.Height - 1)));
Color rightColor = Color.Lerp(BoxColor[2], BoxColor[3], (y / (texture.Height - 1)));
color[x + y * texture.Width] = Color.Lerp(leftColor,
RightColor,
(x / (texture.Width - 1)));
break;
case 2:
color[x + y * texture.Width] = Color.Lerp(BoxColors[0],
BoxColors[1],
(x / (texture.Width - 1)));
break;
default:
color[x + y * texture.Width];
break;
}
}
}
texture.SetData<Color>(color);
}
}

我正在寻找的是以下内容:

  • 4 向渐变颜色(已实现)
  • 圆角矩形
  • 渐变边框

如有任何帮助,我们将不胜感激。

我通过 this question 找出了矩形.

最佳答案

我想出了我遇到的问题;计算角弧。我想到的是,可以用到一个点的距离来理解画边界的方法,而不是用数学来计算一个圆内的点。下面我发布了生成圆角矩形的代码。

public Texture2D CreateRoundedRectangleTexture(GraphicsDevice graphics, int width, int height, int borderThickness, int borderRadius, int borderShadow, List<Color> backgroundColors, List<Color> borderColors, float initialShadowIntensity, float finalShadowIntensity)
{
if (backgroundColors == null || backgroundColors.Count == 0) throw new ArgumentException("Must define at least one background color (up to four).");
if (borderColors == null || borderColors.Count == 0) throw new ArgumentException("Must define at least one border color (up to three).");
if (borderRadius < 1) throw new ArgumentException("Must define a border radius (rounds off edges).");
if (borderThickness < 1) throw new ArgumentException("Must define border thikness.");
if (borderThickness + borderRadius > height / 2 || borderThickness + borderRadius > width / 2) throw new ArgumentException("Border will be too thick and/or rounded to fit on the texture.");
if (borderShadow > borderRadius) throw new ArgumentException("Border shadow must be lesser in magnitude than the border radius (suggeted: shadow <= 0.25 * radius).");

Texture2D texture = new Texture2D(graphics, width, height, false, SurfaceFormat.Color);
Color[] color = new Color[width * height];

for (int x = 0; x < texture.Width; x++)
{
for (int y = 0; y < texture.Height; y++)
{
switch (backgroundColors.Count)
{
case 4:
Color leftColor0 = Color.Lerp(backgroundColors[0], backgroundColors[1], ((float)y / (width - 1)));
Color rightColor0 = Color.Lerp(backgroundColors[2], backgroundColors[3], ((float)y / (height - 1)));
color[x + width * y] = Color.Lerp(leftColor0, rightColor0, ((float)x / (width - 1)));
break;
case 3:
Color leftColor1 = Color.Lerp(backgroundColors[0], backgroundColors[1], ((float)y / (width - 1)));
Color rightColor1 = Color.Lerp(backgroundColors[1], backgroundColors[2], ((float)y / (height - 1)));
color[x + width * y] = Color.Lerp(leftColor1, rightColor1, ((float)x / (width - 1)));
break;
case 2:
color[x + width * y] = Color.Lerp(backgroundColors[0], backgroundColors[1], ((float)x / (width - 1)));
break;
default:
color[x + width * y] = backgroundColors[0];
break;
}

color[x + width * y] = ColorBorder(x, y, width, height, borderThickness, borderRadius, borderShadow, color[x + width * y], borderColors, initialShadowIntensity, finalShadowIntensity);
}
}

texture.SetData<Color>(color);
return texture;
}

private Color ColorBorder(int x, int y, int width, int height, int borderThickness, int borderRadius, int borderShadow, Color initialColor, List<Color> borderColors, float initialShadowIntensity, float finalShadowIntensity)
{
Rectangle internalRectangle = new Rectangle((borderThickness + borderRadius), (borderThickness + borderRadius), width - 2 * (borderThickness + borderRadius), height - 2 * (borderThickness + borderRadius));

if (internalRectangle.Contains(x, y)) return initialColor;

Vector2 origin = Vector2.Zero;
Vector2 point = new Vector2(x, y);

if (x < borderThickness + borderRadius)
{
if (y < borderRadius + borderThickness)
origin = new Vector2(borderRadius + borderThickness, borderRadius + borderThickness);
else if (y > height - (borderRadius + borderThickness))
origin = new Vector2(borderRadius + borderThickness, height - (borderRadius + borderThickness));
else
origin = new Vector2(borderRadius + borderThickness, y);
}
else if (x > width - (borderRadius + borderThickness))
{
if (y < borderRadius + borderThickness)
origin = new Vector2(width - (borderRadius + borderThickness), borderRadius + borderThickness);
else if (y > height - (borderRadius + borderThickness))
origin = new Vector2(width - (borderRadius + borderThickness), height - (borderRadius + borderThickness));
else
origin = new Vector2(width - (borderRadius + borderThickness), y);
}
else
{
if (y < borderRadius + borderThickness)
origin = new Vector2(x, borderRadius + borderThickness);
else if (y > height - (borderRadius + borderThickness))
origin = new Vector2(x, height - (borderRadius + borderThickness));
}

if (!origin.Equals(Vector2.Zero))
{
float distance = Vector2.Distance(point, origin);

if (distance > borderRadius + borderThickness + 1)
{
return Color.Transparent;
}
else if (distance > borderRadius + 1)
{
if (borderColors.Count > 2)
{
float modNum = distance - borderRadius;

if (modNum < borderThickness / 2)
{
return Color.Lerp(borderColors[2], borderColors[1], (float)((modNum) / (borderThickness / 2.0)));
}
else
{
return Color.Lerp(borderColors[1], borderColors[0], (float)((modNum - (borderThickness / 2.0)) / (borderThickness / 2.0)));
}
}


if (borderColors.Count > 0)
return borderColors[0];
}
else if (distance > borderRadius - borderShadow + 1)
{
float mod = (distance - (borderRadius - borderShadow)) / borderShadow;
float shadowDiff = initialShadowIntensity - finalShadowIntensity;
return DarkenColor(initialColor, ((shadowDiff * mod) + finalShadowIntensity));
}
}

return initialColor;
}

private Color DarkenColor(Color color, float shadowIntensity)
{
return Color.Lerp(color, Color.Black, shadowIntensity);
}

上面所有的代码,结果是这样的: Rounded Texture in Action

关于c# - 创建圆角矩形 Texture2D,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17217411/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com