public AchievementPanel(float startX, SpriteFont title, SpriteFont desc, string achievementDesc, GraphicsDevice dev) : base(Vector2.Zero) { // Create "Achievement!" and description GameFonts GameFont titleObj = new GameFont(title, "Achievement!", new Vector2(5), Color.Yellow) { LayerDepth = 0.5f }; GameFont descObj = new GameFont(desc, achievementDesc, new Vector2(2, titleObj.Size.Y + 5 + 4.5f), Color.White) { LayerDepth = 0.5f }; Subsprites.Add(titleObj); Subsprites.Add(descObj); int achievePanelWidth = -1; int achievePanelHeight = -1; // Positioning logic for text elements foreach (var spr in Subsprites) { Vector2 size = Vector2.Zero; if (!(spr is GameFont) && !(spr is GameSprite)) { continue; } if (spr is GameSprite) { size = new Vector2((spr as GameSprite).Texture.Width, (spr as GameSprite).Texture.Height); } else { size = (spr as GameFont).Size; } if (size.Y + spr.Position.Y > achievePanelHeight) { achievePanelHeight = Convert.ToInt32(Math.Ceiling(size.Y + spr.Position.Y)); } if (size.X + spr.Position.X > achievePanelWidth) { achievePanelWidth = Convert.ToInt32(Math.Ceiling(size.X + spr.Position.X)); } } titleObj.Position = new Vector2(achievePanelWidth / 2 - (titleObj.Size.X / 2), titleObj.Position.Y); descObj.Position = new Vector2(achievePanelWidth / 2 - (descObj.Size.X / 2), descObj.Position.Y); // Create a solid color background Subsprites.Insert(0, GameSprite.CreateSolidColor(Vector2.Zero, achievePanelWidth + 5, achievePanelHeight + 10, Color.Black, dev)); Subsprites[0].LayerDepth = 1; Position = new Vector2(startX, -achievePanelHeight); IsVisible = false; Width = achievePanelWidth; Height = achievePanelHeight; changeState(PanelState.Waiting); }