/// <summary> /// Dessine le slot du héros donné à la position donnée. /// </summary> /// <param name="rect"></param> /// <param name="hero"></param> void DrawHero(SpriteBatch batch, Rectangle rect, Server.Entities.EntityHero hero) { float layerDepth = 0.5f; const int iconSize = 16; const int spellSize = 32; var ctrl = m_sceneRenderer.GameServer.GetSrvScene().PickControler; var scene = m_sceneRenderer.GameServer.GetSrvScene(); var texture = ctrl.IsMyTurn(hero.ID) ? Ressources.MenuItemHover : Ressources.MenuItem; EnhancedGui.Drawing.DrawRectBox(batch, texture, rect, Color.White, layerDepth + 0.1f); int x = rect.X + 20; int y = rect.Y + 20; // Dessine l'icone du rôle du héros batch.Draw(GetIcon((Views.EntityHeroRole)hero.Role), new Rectangle(x, y, iconSize, iconSize), null, Color.White, 0.0f, Vector2.Zero, SpriteEffects.None, layerDepth); x += iconSize + 10; // Dessine le nom du héros. batch.DrawString(Ressources.CourrierFont, scene.GetControlerByHeroId(hero.ID).HeroName, new Vector2(x, y), Color.White, 0.0f, Vector2.Zero, 1.0f, SpriteEffects.None, layerDepth); y += 25; x = rect.X + 20; // Dessine les sorts du héros. for (int i = 0; i < hero.Spells.Count; i++) { Rectangle iconRect = new Rectangle(x, y, spellSize, spellSize); batch.Draw( Ressources.GetSpellTexture(hero.Spells[i].Name), iconRect, null, Color.White, 0.0f, Vector2.Zero, SpriteEffects.None, layerDepth); x += spellSize + 4; } }
/// <summary> /// Dessine le lobby. /// </summary> /// <param name="batch"></param> /// <param name="time"></param> public void Draw(SpriteBatch batch, GameTime time, RenderTarget2D output) { int sw = (int)Ressources.ScreenSize.X; int sh = (int)Ressources.ScreenSize.Y; const int iconSize = 16; // Dessine l'avant plan. batch.GraphicsDevice.SetRenderTarget(output); batch.Begin(SpriteSortMode.BackToFront, BlendState.AlphaBlend); batch.GraphicsDevice.Clear(Color.LightGray); int[] playerCount = new int[2]; // Dessine les héros connectés. switch (m_sceneRenderer.Mode) { case DataMode.Direct: var scene = m_sceneRenderer.GameServer.GetSrvScene(); lock (scene.ControlerLock) { foreach (var kvp in scene.Controlers) { Server.Entities.EntityHero hero = kvp.Value.Hero; int team = ((int)(hero.Type & Server.Entities.EntityType.Teams) >> 1) - 1; // 0 ou 1 Rectangle rect = GetDrawRect(playerCount[team], team); if (hero.ID == scene.LobbyControler.SelectedHeroId) { EnhancedGui.Drawing.DrawRectBox(batch, Ressources.MenuItemHover, rect, Color.White, 0.2f); } else { EnhancedGui.Drawing.DrawRectBox(batch, Ressources.MenuItem, rect, Color.White, 0.2f); } string s = kvp.Value.HeroName + " (" + kvp.Value.GetType().Name.Replace("Controler", "") + ")"; Vector2 size = Ressources.CourrierFont.MeasureString(s); Vector2 offset = (new Vector2(size.X, rect.Height) - size) / 2; batch.Draw(GetIcon((Views.EntityHeroRole)hero.Role), new Rectangle(rect.X + 2, rect.Y + 4, iconSize, iconSize), null, Color.White, 0.0f, Vector2.Zero, SpriteEffects.None, 0.0f); batch.DrawString(Ressources.CourrierFont, s, new Vector2(rect.X + (iconSize + 6), rect.Y) + offset, Color.White, 0.0f, Vector2.Zero, 1f, SpriteEffects.None, 0.0f); playerCount[team]++; } } break; case DataMode.Remote: throw new NotImplementedException(); } // VS int oy = (1 * sh / 3); int scale = 6; string str = "VS"; Vector2 strsize = Ressources.CourrierFont.MeasureString(str) * scale; batch.DrawString(Ressources.CourrierFont, str, new Vector2((sw - (int)strsize.X) / 2, (-oy / 2 + sh - (int)strsize.Y) / 2), Color.Black, 0.0f, Vector2.Zero, scale, SpriteEffects.None, 0.0f); // Instructions str = "Appuyez sur Entrée pour lancer le jeu."; strsize = Ressources.CourrierFont.MeasureString(str); batch.DrawString(Ressources.CourrierFont, str, new Vector2((sw - (int)strsize.X) / 2, sh - 25), Color.Black); batch.End(); }
/// <summary> /// Dessine l'entité donnée en utilisant les primitives fournies /// par le batch donné. /// </summary> public virtual void Draw(SpriteBatch batch, GameTime time, Server.Entities.EntityBase entity) { // Extrait des informations utiles de l'entité. Vector2 entityPosition = entity.Position; Views.EntityType type = (Views.EntityType)entity.Type; Server.Entities.EntityHero entityAsHero = entity as Server.Entities.EntityHero; Views.EntityHeroRole role = entityAsHero != null ? (Views.EntityHeroRole)entityAsHero.Role : 0; Point scroll = m_mapRenderer.Scrolling; Point drawPos = new Point((int)(entityPosition.X * m_mapRenderer.UnitSize) - scroll.X, (int)(entityPosition.Y * m_mapRenderer.UnitSize) - scroll.Y); // Si l'entité est hors du champ de vision : on la clip. if (drawPos.X > m_mapRenderer.Viewport.Right || drawPos.Y > m_mapRenderer.Viewport.Bottom || drawPos.X < m_mapRenderer.Viewport.Left - m_mapRenderer.UnitSize || drawPos.Y < m_mapRenderer.Viewport.Top - m_mapRenderer.UnitSize) { return; } Color col = Color.White; Texture2D tex = Ressources.DummyTexture; float sx = 1; float sy = 1; // scale X, Y bool blue = type.HasFlag(Views.EntityType.Team1); switch (type & (Views.EntityType.Teams ^ (Views.EntityType.All))) { // Virus case Views.EntityType.Virus: sx = 1; sy = 1; tex = blue ? Ressources.BlueVirus : Ressources.RedVirus; break; // Player case Views.EntityType.Player: sx = 1; sy = 1; switch (role) { case Views.EntityHeroRole.Fighter: tex = blue ? Ressources.BlueFighter : Ressources.RedFighter; break; case Views.EntityHeroRole.Mage: tex = blue ? Ressources.BlueMage : Ressources.RedMage; break; case Views.EntityHeroRole.Tank: tex = blue ? Ressources.BlueTank : Ressources.RedTank; break; } break; // Tower case Views.EntityType.Tower: sx = 1; sy = 2; tex = blue ? Ressources.BlueTower : Ressources.RedTower; break; // Checkpoint case Views.EntityType.Checkpoint: sx = 0.25f; sy = 0.25f; col = blue ? Color.Blue : Color.Red; return; case Views.EntityType.Datacenter: sx = 2.5f; sy = 2.5f; tex = blue ? Ressources.BlueDatacenter : Ressources.RedDatacenter; break; case Views.EntityType.Spawner: sx = 2; sy = 2; tex = blue ? Ressources.BlueSpawner : Ressources.RedSpawner; break; case Views.EntityType.Monster: tex = Ressources.CampMonster; break; case Views.EntityType.Router: sx = 2; sy = 2; tex = Ressources.Router; break; case Views.EntityType.Ward: sx = 1; sy = 1; tex = blue ? Ressources.BlueWard : Ressources.RedWard; break; case Views.EntityType.WardPlacement: return; } // Rectangle de dessin de l'entité Rectangle drawRect = new Rectangle(drawPos.X, drawPos.Y, (int)(m_mapRenderer.UnitSize * sx), (int)(m_mapRenderer.UnitSize * sy)); // 0 back, 1 front float entityZ = 0.25f + ((drawPos.Y - tex.Height) / m_mapRenderer.SceneRenderer.MainRenderTarget.Height) / 2; // Dessin de la jauge int totalLength = (int)(drawRect.Width) * 3 / 4; int totalH = 6; Vector2 gaugeOrigin = new Vector2(0, 0); float max = (entity.GetMaxHP() + entity.ShieldPoints); float percent = entity.HP / max; float shieldPercent = entity.ShieldPoints / max; int offsetY = -drawRect.Height; int offsetX = -drawRect.Width / 2; Rectangle gaugeRect = new Rectangle(drawPos.X + offsetX + (drawRect.Width - totalLength) / 2, drawPos.Y + offsetY - 10, totalLength, totalH); if (!entity.IsDamageImmune) { float gaugeZ = 0.25f + ((gaugeRect.Y - tex.Height) / m_mapRenderer.SceneRenderer.MainRenderTarget.Height) / 2; Color gaugeColor = type.HasFlag(Views.EntityType.Team1) ? Color.Blue : (type.HasFlag(Views.EntityType.Team2) ? Color.Red : Color.White); // Jauge vide batch.Draw(Ressources.LifebarEmpty, gaugeRect, null, gaugeColor, 0, gaugeOrigin, SpriteEffects.None, gaugeZ); // Vie gaugeRect.Width = (int)(totalLength * percent); batch.Draw(Ressources.LifebarFull, gaugeRect, null, gaugeColor, 0, gaugeOrigin, SpriteEffects.None, gaugeZ + 0.00001f); if (entity.ShieldPoints > 0) { // Shield gaugeRect.X += (int)(totalLength * percent); gaugeRect.Width = (int)(gaugeRect.Width * shieldPercent); batch.Draw(Ressources.LifebarFull, gaugeRect, null, Color.White, 0, gaugeOrigin, SpriteEffects.None, gaugeZ + 0.00002f); } } // Entité col.A = (byte)((m_mapRenderer.HasVision((type & Views.EntityType.Teams) ^ Views.EntityType.Teams, entityPosition)) ? 255 : 220); if (entity.IsStealthed) { col.A = 120; } // Dessin de l'entité batch.Draw(tex, drawRect, null, col, __angle, new Vector2(tex.Width / 2, tex.Height), SpriteEffects.None, entityZ); // Roots if (entity.IsSilenced) { int us = m_mapRenderer.UnitSize; Rectangle drect = new Rectangle(gaugeRect.X + us, gaugeRect.Y, us / 2, us / 2); batch.Draw(Ressources.SilenceIcon, drect, null, Color.White, 0.0f, new Vector2(0, 0), SpriteEffects.None, entityZ); } if (entity.IsBlind) { int us = m_mapRenderer.UnitSize; Rectangle drect = new Rectangle(gaugeRect.X - us, gaugeRect.Y, us / 2, us / 2); batch.Draw(Ressources.BlindIcon, drect, null, Color.White, 0.0f, new Vector2(0, 0), SpriteEffects.None, entityZ); } }