private void Draw_TopLeftUI(SpriteBatch spriteBatch) { //Draw the win progress bar Vector2 barPos = characterDrawPos + new Vector2(uiScale * turnPlayer.CharacterSprite.Width / 2, 0f); PercentageBar.Draw(spriteBatch, emptyRect, barPos, winBarDimensions, turnPlayer.Colour, Color.Gray, turnPlayer.WinThreshold, turnPlayer.WinProgress); string text = $"{turnPlayer.WinProgress}/{turnPlayer.WinThreshold} Wins"; spriteBatch.DrawString(bebasSmall, text, barPos + (winBarDimensions - 0.6f * bebasSmall.MeasureString(text)) / 2, Color.White, 0f, Vector2.Zero, 0.6f, SpriteEffects.None, 0f); //Draw the unit cap bar. Vector2 unitBarPos = barPos + new Vector2(0, winBarDimensions.Y); int unitCount = grid.CountPlayerUnitsOnGrid(turnPlayer.Id); PercentageBar.Draw(spriteBatch, emptyRect, unitBarPos, unitBarDimensions, Color.DarkRed, Color.YellowGreen, turnPlayer.UnitCap, unitCount); text = $"{unitCount}/{turnPlayer.UnitCap} Units"; spriteBatch.DrawString(bebasSmall, text, unitBarPos + (unitBarDimensions - 0.5f * bebasSmall.MeasureString(text)) / 2, Color.White, 0f, Vector2.Zero, 0.5f, SpriteEffects.None, 0f); //Draw the players money amount. moneyBox.Draw(spriteBatch); string moneyText = $"{turnPlayer.Money}"; Vector2 textSize = bebasSmall.MeasureString(moneyText); Vector2 basePos = moneyBox.GetPos() + moneyBoxDimensions / 2; spriteBatch.DrawString(bebasSmall, moneyText, basePos - new Vector2(0, textSize.Y / 2), Color.White); spriteBatch.Draw(moneyIcon, position: basePos + new Vector2(textSize.X + moneyBoxDimensions.X / 35, 0) - uiScale / 2 * new Vector2(0, moneyIcon.Height), scale: uiScaleVector ); //Draw the player's character. spriteBatch.Draw(texture: characterBoundary, position: characterDrawPos - new Vector2(3 * uiScale, 0), scale: uiScaleVector, color: turnPlayer.Colour); spriteBatch.Draw(texture: turnPlayer.CharacterSprite, position: characterDrawPos, scale: uiScaleVector); //draw end turn button if (endTurnButton.IsHovered) { spriteBatch.Draw(texture: endTurnButton.HoverTexture, position: endTurnButton.Position, scale: uiScaleVector); } else { spriteBatch.Draw(texture: endTurnButton.ButtonTexture, position: endTurnButton.Position, scale: uiScaleVector); } spriteBatch.DrawString(bebasSmall, "End Turn", endTurnButton.MidPoint - 0.6f * bebasSmall.MeasureString("End Turn") / 2 + new Vector2(0, 1), Color.White, 0f, Vector2.Zero, 0.6f, SpriteEffects.None, 0); //draw the level up unit cap button. levelUnitCapButton.Draw(spriteBatch, turnPlayer, moneyIcon, WindowTools.GetUpscaledValue(2f), bebasSmall, 0.6f); //and the ability button useAbilityButton.Draw(spriteBatch, turnPlayer, bebasSmall, 0.6f); divisorLine.Draw(spriteBatch); stageInfo.Draw(spriteBatch, vsAiIcon, vsPlayerIcon); //help button helpButton.Draw(spriteBatch, bebasSmall, 1f); }
public void Draw(SpriteBatch spriteBatch, Color textColor) { spriteBatch.Begin(samplerState: SamplerState.PointClamp); //draw underlying alpha box playerNameBox.Draw(spriteBatch); //calculate the size of the players name Vector2 nameSize = textFont.MeasureString(playerName); //calculate the position where the name needs to be drawn to be central // to the player name box. Vector2 namePos = playerNameBox.GetCentrePos() - 0.5f * nameSize; //draw the player name spriteBatch.DrawString(textFont, playerName, namePos, textColor, 0f, Vector2.Zero, 1f, SpriteEffects.None, 1f); characterSpriteBox.Draw(spriteBatch); characterInfoBox.Draw(spriteBatch); //draw dividing lines divisorA.Draw(spriteBatch); divisorB.Draw(spriteBatch); //draw respective information about character if a character is selected if (characterType != null) { //draw selected character sprite Vector2 spritePos = characterSpriteBox.GetCentrePos() - 0.5f * spriteScale * UiTools.BoundsToVector(characterSprite.Bounds); spriteBatch.Draw(characterSprite, position: spritePos, scale: spriteScaleVector); //draw character name string chrName = characterType.Name; Vector2 basePos = characterInfoBox.GetPos() + new Vector2(characterInfoBox.DestinationRect.Width / 2, textPadding + textFont.MeasureString(chrName).Y / 2); namePos = basePos - textFont.MeasureString(chrName) / 2; spriteBatch.DrawString(textFont, chrName, namePos, textColor); string ability = $"Ability:"; Vector2 abilitySize = textFont.MeasureString(ability); Vector2 abilityPos = basePos + new Vector2(0, 5 * lineSpacing + textFont.MeasureString(chrName).Y / 2); spriteBatch.DrawString(textFont, ability, abilityPos - abilitySize / 2, Color.Red); //draw the ability description. // this is a long string being drawn to a small box, so // the text is wrapped according to the width of the box. // (See uitools for how text wrapping works). float drawGap = lineSpacing + textFont.MeasureString(abilityDescription).Y / 2; Vector2 linesOrigin = abilityPos + new Vector2(0, abilitySize.Y / 2 + lineSpacing); for (int i = 0; i < descriptionLines.Length; i++) { spriteBatch.DrawString(textFont, descriptionLines[i], linesOrigin + new Vector2(0, i * drawGap) - textFont.MeasureString(descriptionLines[i]) / 2, Color.White); } } spriteBatch.End(); }
private void Draw_UI(SpriteBatch spriteBatch) { helpButton.Draw(spriteBatch, bebasSmall, 1f); //draw the players character and money if vs an AI. if (useAiOpponent) { moneyUiBox.Draw(spriteBatch); string moneyText = $"{playerToCheckWinCondition.Money}"; Vector2 textSize = bebasSmall.MeasureString(moneyText); Vector2 basePos = moneyUiBox.GetPos() + new Vector2(moneyBoxDimensions.X / 2f, moneyBoxDimensions.Y / 2); spriteBatch.DrawString(bebasSmall, moneyText, basePos - new Vector2(0, textSize.Y / 2), Color.White); spriteBatch.Draw(moneyIcon, position: basePos + new Vector2(textSize.X + moneyBoxDimensions.X / 35, 0) - uiScale / 2 * new Vector2(0, moneyIcon.Height), scale: uiScaleVector ); //Draw the player's character. spriteBatch.Draw(texture: characterBoundary, position: characterPos[0] - new Vector2(3 * uiScale, 0), scale: uiScaleVector, color: playerToCheckWinCondition.Colour); spriteBatch.Draw(texture: playerToCheckWinCondition.CharacterSprite, position: characterPos[0], scale: uiScaleVector); } //otherwise, draw each players character and their win progress. else { //Draw each players win % bars. Vector2 barPos = characterPos[0] + new Vector2(uiScale * otherPlayer.CharacterSprite.Width / 2, 0f); PercentageBar.Draw(spriteBatch, emptyRect, barPos, winBarDimensions, otherPlayer.Colour, Color.Gray, otherPlayer.WinThreshold, otherPlayer.WinProgress); string text = $"{otherPlayer.WinProgress}/{otherPlayer.WinThreshold} Wins"; spriteBatch.DrawString(bebasSmall, text, barPos + (winBarDimensions - 0.6f * bebasSmall.MeasureString(text)) / 2, Color.White, 0f, Vector2.Zero, 0.6f, SpriteEffects.None, 0f); Vector2 lowerBarPos = characterPos[1] + new Vector2(uiScale * playerToCheckWinCondition.CharacterSprite.Width / 2, -winBarDimensions.Y); PercentageBar.Draw(spriteBatch, emptyRect, lowerBarPos, winBarDimensions, playerToCheckWinCondition.Colour, Color.Gray, playerToCheckWinCondition.WinThreshold, playerToCheckWinCondition.WinProgress); text = $"{playerToCheckWinCondition.WinProgress}/{playerToCheckWinCondition.WinThreshold} Wins"; spriteBatch.DrawString(bebasSmall, text, lowerBarPos + (winBarDimensions - 0.6f * bebasSmall.MeasureString(text)) / 2, Color.White, 0f, Vector2.Zero, 0.6f, SpriteEffects.None, 0f); //Draw each players character with their boundary (their respective colour) spriteBatch.Draw(texture: characterBoundary, position: characterPos[0] - new Vector2(3 * uiScale, 0), scale: uiScaleVector, color: otherPlayer.Colour); spriteBatch.Draw(texture: otherPlayer.CharacterSprite, position: characterPos[0], scale: uiScaleVector); Vector2 lowerDrawPos = characterPos[1] - new Vector2(0, playerToCheckWinCondition.CharacterSprite.Height * uiScale); spriteBatch.Draw(texture: characterBoundary, position: lowerDrawPos - new Vector2(3 * uiScale, 0), scale: uiScaleVector, color: playerToCheckWinCondition.Colour); spriteBatch.Draw(texture: playerToCheckWinCondition.CharacterSprite, position: lowerDrawPos, scale: uiScaleVector); } logDisplay.Draw(spriteBatch, actionLog.GetActionsInOrder(), players, actionLogTextures); }
public void Draw(SpriteBatch spriteBatch, Texture2D vsAiIcon, Texture2D vsPlayerIcon) { //draw underlying alpha box textBox.Draw(spriteBatch); //calculate the size of the text Vector2 textSize = textFont.MeasureString(text); //calculate the position where the text needs to be drawn to be central // to the text box. Vector2 textPos = textBox.GetCentrePos() - 0.5f * new Vector2(textSize.X, textSize.Y); //draw the text spriteBatch.DrawString(textFont, text, textPos, Color.White, 0f, Vector2.Zero, 1f, SpriteEffects.None, 1f); //draw the underlying alpha boxes for each round. foreach (RectBox box in stageIconBoxes) { box.Draw(spriteBatch); } //draw dividing line divisorA.Draw(spriteBatch); //draw respective information about each round. for (int i = 0; i < stage.Length; i++) { if (stage.Rounds[i] == Stage.RoundTypes.vsAi) { spriteBatch.Draw(vsAiIcon, position: stageIconBoxes[i].GetCentrePos() - 0.5f * spriteScale * UiTools.BoundsToVector(vsAiIcon.Bounds), scale: spriteScaleVector, color: (i < stageIndex - 1)? Color.Gray : Color.White ); } else { spriteBatch.Draw(vsPlayerIcon, position: stageIconBoxes[i].GetCentrePos() - 0.5f * spriteScale * UiTools.BoundsToVector(vsPlayerIcon.Bounds), scale: spriteScaleVector, color: (i < stageIndex - 1) ? Color.DarkRed : Color.Red ); } } }
public void Draw(SpriteBatch spriteBatch, BattleTurn.ActionArgs[] actions, Player[] players, DrawParams textures) { //pass in the information about actions -- draw for each one. This information does not need to be stored here too. //draw underlying alpha box for the box containing text. textBox.Draw(spriteBatch); //calculate the size of the text Vector2 nameSize = textFont.MeasureString(text); //calculate the position where the text needs to be drawn to be central // to the text box. Vector2 namePos = textBox.GetCentrePos() - 0.5f * new Vector2(nameSize.X, nameSize.Y); //draw the text spriteBatch.DrawString(textFont, text, namePos, Color.White, 0f, Vector2.Zero, 1f, SpriteEffects.None, 1f); foreach (RectBox box in actionBoxes) { box.Draw(spriteBatch); } //draw respective information about each action for (int i = 0; i < actions.Length; i++) { BattleTurn.ActionArgs action = actions[i]; RectBox boxDrawingTo = actionBoxes[i]; Vector2 boxPos = boxDrawingTo.GetPos(); Color boxColor = (action.ActingUnit.OwnerId == 3) ? Color.Gray : players.Where(player => player.Id == action.ActingUnit.OwnerId).First().Colour; //set the color to Ai color/player color //draw a coloured block to specify which player the acting unit belongs to. //Using a single pixel texture instead of a non-disposable object (say my RectBox class for instance) // eliminates memory leak issues. spriteBatch.Draw(emptyRect, new Rectangle(boxDrawingTo.GetPos().ToPoint(), new Point(10, actionBoxHeight)), color: boxColor); Texture2D actingUnitSprite = action.ActingUnit.GetSprite(textures.unitSprites); //draw the units involved in each action, and the icons displaying the type of action. if (action.IsAttack) { //draw the attacking unit spriteBatch.Draw(actingUnitSprite, position: boxPos + new Vector2(width / 5, boxDrawingTo.GetHeight() / 2) - spriteScale / 2 * UiTools.BoundsToVector(actingUnitSprite.Bounds), scale: spriteScaleVector ); //draw the attack icon spriteBatch.Draw(textures.attackIcon, position: boxPos + new Vector2(width / 5, boxDrawingTo.GetHeight() / 2), scale: iconScaleVector ); //draw the target unit Texture2D targetUnitSprite = action.TargetUnit.GetSprite(textures.unitSprites); spriteBatch.Draw(targetUnitSprite, position: boxPos + new Vector2(2.5f * width / 5, boxDrawingTo.GetHeight() / 2) - spriteScale / 2 * UiTools.BoundsToVector(targetUnitSprite.Bounds), scale: spriteScaleVector ); //draw the defense icon spriteBatch.Draw(textures.defenseIcon, position: boxPos + new Vector2(2.5f * width / 5, boxDrawingTo.GetHeight() / 2) - iconScale * new Vector2(textures.defenseIcon.Width, 0), scale: iconScaleVector ); //draw the skull icon if the target unit died as a result of the action. if (action.TargetFainted) { spriteBatch.Draw(textures.skullIcon, position: boxPos + new Vector2(3.5f * width / 5, boxDrawingTo.GetHeight() / 2) - iconScale / 2 * UiTools.BoundsToVector(textures.skullIcon.Bounds), scale: iconScaleVector * 2 ); } } else if (action.IsMove) { //draw acting unit spriteBatch.Draw(actingUnitSprite, position: boxPos + new Vector2(width / 5, boxDrawingTo.GetHeight() / 2) - spriteScale / 2 * UiTools.BoundsToVector(actingUnitSprite.Bounds), scale: spriteScaleVector ); //draw move icon spriteBatch.Draw(textures.moveIcon, position: boxPos + new Vector2(width / 5, boxDrawingTo.GetHeight() / 2), scale: iconScaleVector ); //draw target unit Texture2D targetUnitSprite = action.TargetUnit.GetSprite(textures.unitSprites); spriteBatch.Draw(targetUnitSprite, position: boxPos + new Vector2(2.5f * width / 5, boxDrawingTo.GetHeight() / 2) - spriteScale / 2 * UiTools.BoundsToVector(targetUnitSprite.Bounds), scale: spriteScaleVector ); //draw targetting icon spriteBatch.Draw(textures.targetIcon, position: boxPos + new Vector2(2.5f * width / 5, boxDrawingTo.GetHeight() / 2) - iconScale * new Vector2(textures.targetIcon.Width, 0), scale: iconScaleVector ); } else //(No move) { //Draw the unit trying to act spriteBatch.Draw(actingUnitSprite, position: boxPos + new Vector2(width / 5, boxDrawingTo.GetHeight() / 2) - spriteScale / 2 * UiTools.BoundsToVector(actingUnitSprite.Bounds), scale: spriteScaleVector ); //Draw no act icon (cant move) spriteBatch.Draw(textures.noMoveIcon, position: boxPos + new Vector2(width / 5, boxDrawingTo.GetHeight() / 2), scale: iconScaleVector ); } } //draw dividing line divisorA.Draw(spriteBatch); }
public void Draw(SpriteBatch spriteBatch, Player owner, UnitShop.ShopEntry[] entries, Dictionary <Type, Texture2D> unitSprites, Texture2D moneyIcon, SpriteFont textFont) { //pass in the information about shop entries -- draw for each one. //draw underlying alpha box for the box containing text. textBox.Draw(spriteBatch); //calculate the size of the text Vector2 textSize = textFont.MeasureString(text); //calculate the position where the text needs to be drawn to be central // to the text box. Vector2 textPos = textBox.GetCentrePos() - 0.5f * textSize; //draw the text spriteBatch.DrawString(textFont, text, textPos, Color.White, 0f, Vector2.Zero, 1f, SpriteEffects.None, 1f); foreach (UnitShopButton box in unitBoxes) { box.Draw(spriteBatch, owner, entries); } //draw respective information about each entry for (int i = 0; i < entries.Length; i++) { UnitShop.ShopEntry entry = entries[i]; UnitShopButton boxDrawingTo = unitBoxes[i]; Vector2 boxPos = boxDrawingTo.GetPos(); Texture2D unitSprite = unitSprites[entry.unitType]; spriteBatch.Draw(unitSprite, position: boxPos + new Vector2(width / 6, boxDrawingTo.GetHeight() / 2) - spriteScale / 2 * UiTools.BoundsToVector(unitSprite.Bounds), scale: spriteScaleVector ); if (entry.Sold) { Vector2 size = textFont.MeasureString(soldText); Vector2 pos = boxPos + new Vector2(width / 3, (boxDrawingTo.GetHeight() - size.Y) / 2); spriteBatch.DrawString(textFont, soldText, pos, Color.White); } else if (owner.IsBenchFull()) { Vector2 size = textFont.MeasureString(fullText); Vector2 pos = boxPos + new Vector2(width / 3, (boxDrawingTo.GetHeight() - size.Y) / 2); spriteBatch.DrawString(textFont, fullText, pos, Color.White); } else { string text = $"Buy: {entry.cost}"; Vector2 size = textFont.MeasureString(text); Vector2 pos = boxPos + new Vector2(width / 3, (boxDrawingTo.GetHeight() - size.Y) / 2); spriteBatch.DrawString(textFont, text, pos, Color.White); spriteBatch.Draw(moneyIcon, position: boxPos + new Vector2(width / 3 + width / 15 + size.X, boxDrawingTo.GetHeight() / 2) - spriteScale / 2 * UiTools.BoundsToVector(moneyIcon.Bounds), scale: spriteScaleVector ); } } //draw dividing line divisorA.Draw(spriteBatch); }