/// <summary> /// Obtient ou définit une valeur indiquant si la/les teams données ont la vision au point donné. /// </summary> /// <returns></returns> public bool HasVision(Views.EntityType teams, Vector2 position) { switch (m_sceneRenderer.Mode) { case DataMode.Direct: return(Map.Vision.HasVision((Server.Entities.EntityType)teams, position)); case DataMode.Remote: teams &= (Views.EntityType.Team1 | Views.EntityType.Team2); return((MapView.VisionMap.Vision[(int)position.X][(int)position.Y] & (Views.VisionFlags)teams) != 0); default: throw new NotImplementedException(); } }
/// <summary> /// Dessine l'écran de fin du jeu. /// </summary> public void DrawEndOfGameDirect(SpriteBatch batch) { // Dessine l'état final du jeu. batch.GraphicsDevice.SetRenderTarget(m_mainRenderTarget); batch.GraphicsDevice.Clear(Color.White); /*batch.Begin(SpriteSortMode.Immediate, BlendState.AlphaBlend); * batch.Draw(m_mainRenderTarget, new Microsoft.Xna.Framework.Vector2(0, 0), Color.Wheat); * batch.End();*/ batch.Begin(); Views.EntityType winner = (Views.EntityType)GameServer.GetSrvScene().GetWinnerTeam(); // Ecrit le nom des gagnants. int[] yTeam = new int[2] { 200, 200 }; int[] xTeam = new int[2] { 450, 800 }; // Dessine le nom de l'équipe gagnante. Texture2D tex = winner == EntityType.Team1 ? Ressources.Team1Wins : Ressources.Team2Wins; batch.Draw(tex, new Microsoft.Xna.Framework.Vector2((m_mainRenderTarget.Width - tex.Width) / 2, (m_mainRenderTarget.Height - tex.Height) / 2), Color.White); // Affiche la composition des équipes. foreach (var hero in MapRdr.Map.Heroes) { int teamId = (hero.Type & Server.Entities.EntityType.Teams) == Server.Entities.EntityType.Team1 ? 0 : 1; Color color = teamId == 0 ? Color.Blue : Color.Red; batch.DrawString(Ressources.CourrierFont, GameServer.GetSrvScene().GetControlerByHeroId(hero.ID).HeroName, new Microsoft.Xna.Framework.Vector2(xTeam[teamId], yTeam[teamId]), color); if (((Views.EntityType)hero.Type & Views.EntityType.Teams) == winner) { // traitement pour les vainqueurs ? } yTeam[teamId] += 40; } 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); } }
/// <summary> /// Dessine l'entité à la position donnée. /// /// Cette méthode doit être réécrite pour chaque type d'entité. /// </summary> /// <param name="time">Temps de jeu.</param> /// <param name="batch">Batch sur lequel dessiner.</param> /// <param name="drawPos">Position à laquelle dessiner l'unité.</param> public virtual void Draw(SpriteBatch batch, GameTime time, Vector2 entityPosition, Views.EntityType type, Views.EntityHeroRole role) { /* * 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); * * 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; ||if (type.HasFlag(Views.EntityType.Team1)) || col = Color.Blue; ||else if (type.HasFlag(Views.EntityType.Team2)) || col = Color.Red; ||else || col = Color.White; || ||Texture2D tex = Ressources.DummyTexture; ||if (type.HasFlag(Views.EntityType.Tower)) ||{ || tex = (type & Views.EntityType.Teams) == Views.EntityType.Team1 ? Ressources.BlueTower : Ressources.RedTower; || col = Color.White; ||} ||else if (type.HasFlag(Views.EntityType.Spawner)) || tex = Ressources.TextBox; ||else if (type.HasFlag(Views.EntityType.WardPlacement)) || tex = Ressources.SelectMark; || ||int s = m_mapRenderer.UnitSize / 2; ||int sx = m_mapRenderer.UnitSize / 2; ||int sy = m_mapRenderer.UnitSize / 2; ||if (type.HasFlag(Views.EntityType.Checkpoint)) ||{ || sx /= 4; || sy /= 4; ||} ||else if(type.HasFlag(Views.EntityType.Tower)) ||{ || sy *= 4; || sx *= 2; ||} ||else if(type.HasFlag(Views.EntityType.Player)) ||{ || bool blue = type.HasFlag(Views.EntityType.Team1); || 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; || } || sx *= 2; || sy *= 2; || col = Color.White; ||} ||col.A = (byte)((m_mapRenderer.HasVision((type & Views.EntityType.Teams) ^ Views.EntityType.Teams, entityPosition)) ? 255 : 220); ||batch.Draw(tex, || new Rectangle(drawPos.X, drawPos.Y, sx, sy), null, col, __angle, new Vector2(s, s), SpriteEffects.None, 0.0f);*/ }