* 1.0.1.9 - 5/20/2013
* - Adding mono support * * 1.0.1.10 - 11/29/2014 * - Adding prompt factory class to generate a Final Fantasy type text prompt * - Updating Gleed2D support to work with latest version of Gleed2D
This commit is contained in:
		
							
								
								
									
										149
									
								
								axios/Factories/Prompt.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										149
									
								
								axios/Factories/Prompt.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,149 @@
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using Microsoft.Xna.Framework;
 | 
			
		||||
using Microsoft.Xna.Framework.Graphics;
 | 
			
		||||
 | 
			
		||||
namespace Axios.Factories
 | 
			
		||||
{
 | 
			
		||||
    public static class Prompt
 | 
			
		||||
    {
 | 
			
		||||
        // Copied from http://stackoverflow.com/a/17260476/195722
 | 
			
		||||
        // Written by Blaze Phoenix
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Creates a rounded rectangle
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        /// <param name="graphics"></param>
 | 
			
		||||
        /// <param name="width"></param>
 | 
			
		||||
        /// <param name="height"></param>
 | 
			
		||||
        /// <param name="borderThickness"></param>
 | 
			
		||||
        /// <param name="borderRadius"></param>
 | 
			
		||||
        /// <param name="borderShadow"></param>
 | 
			
		||||
        /// <param name="backgroundColors"></param>
 | 
			
		||||
        /// <param name="borderColors"></param>
 | 
			
		||||
        /// <param name="initialShadowIntensity"></param>
 | 
			
		||||
        /// <param name="finalShadowIntensity"></param>
 | 
			
		||||
        /// <returns></returns>
 | 
			
		||||
        public static Texture2D CreateRoundedRectangleTexture(this 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 static 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 static Color DarkenColor(Color color, float shadowIntensity)
 | 
			
		||||
        {
 | 
			
		||||
            return Color.Lerp(color, Color.Black, shadowIntensity);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user