/// <summary> /// Shows the missle on canva /// </summary> /// <param name="canva">The canva.</param> /// <param name="visibleStart">The visible map area start.</param> /// <param name="visibleFinish">The visible map area finish.</param> /// <param name="monsters">The monsters.</param> internal void Show(IGraphic canva, Point visibleStart, Point visibleFinish, IEnumerable<Monster> monsters) { if ((DestroyMe) || ((_position.X - visibleStart.X * Settings.ElemSize < 5) || (_position.Y - visibleStart.Y * Settings.ElemSize < 5) || (-_position.X + visibleFinish.X * Settings.ElemSize < 5) || (-_position.Y + visibleFinish.Y * Settings.ElemSize < 5)) || (monsters == null)) return; //Getting Monster var monster = monsters.FirstOrDefault(elem => elem.ID == _aimID); if (monster == null) { DestroyMe = true; return; } Point aimPos = new Point((int)monster.GetCanvaPos.X, (int)monster.GetCanvaPos.Y); switch (_missleType) { case eTowerType.Simple: float tang; if ((Math.Abs((_position.X - aimPos.X) - 0) > 0.01) && (Math.Abs((_position.Y - aimPos.Y) - 0) > 0.01)) tang = Math.Abs((_position.Y - aimPos.Y) / (_position.X - aimPos.X)); else tang = 1; Point secondPosition;//Position of second missle point #region Second point calculation if (_position.X > aimPos.X) { if (_position.Y > aimPos.Y) secondPosition = new Point( Convert.ToInt32(_position.X + 10 * Math.Sqrt(1 / (1 + Math.Pow(tang, 2)))), Convert.ToInt32(_position.Y + 10 * Math.Sqrt(1 / (1 + Math.Pow(1 / tang, 2))))); else secondPosition = new Point( Convert.ToInt32(_position.X + 10 * Math.Sqrt(1 / (1 + Math.Pow(tang, 2)))), Convert.ToInt32(_position.Y - 10 * Math.Sqrt(1 / (1 + Math.Pow(1 / tang, 2))))); } else { if (_position.Y > aimPos.Y) secondPosition = new Point( Convert.ToInt32(_position.X - 10 * Math.Sqrt(1 / (1 + Math.Pow(tang, 2)))), Convert.ToInt32((_position.Y + 10 * Math.Sqrt(1 / (1 + Math.Pow(1 / tang, 2)))))); else secondPosition = new Point( Convert.ToInt32(_position.X - 10 * Math.Sqrt(1 / (1 + Math.Pow(tang, 2)))), Convert.ToInt32(_position.Y - 10 * Math.Sqrt(1 / (1 + Math.Pow(1 / tang, 2))))); } #endregion canva.DrawLine(new Pen(_misslePenColor, 2), new Point((int)((_position.X - visibleStart.X * Settings.ElemSize) * Scaling) + Settings.DeltaX, (int)((_position.Y - visibleStart.Y * Settings.ElemSize) * Scaling) + Settings.DeltaY), new Point((int)((secondPosition.X - visibleStart.X * Settings.ElemSize) * Scaling) + Settings.DeltaX, (int)((secondPosition.Y - visibleStart.Y * Settings.ElemSize) * Scaling) + Settings.DeltaY)); break; case eTowerType.Splash: canva.FillEllipse(new SolidBrush(_missleBrushColor), (int)(_position.X - 5 - visibleStart.X * Settings.ElemSize) * Scaling + Settings.DeltaX, (int)(_position.Y - 5 - visibleStart.Y * Settings.ElemSize) * Scaling + Settings.DeltaY, 10 * Scaling, 10 * Scaling); canva.DrawEllipse(new Pen(_misslePenColor), (int)(_position.X - 5 - visibleStart.X * Settings.ElemSize) * Scaling + Settings.DeltaX, (int)(_position.Y - 5 - visibleStart.Y * Settings.ElemSize) * Scaling + Settings.DeltaY, 10 * Scaling, 10 * Scaling); break; } }
/// <summary> /// Shows the monster. /// </summary> /// <param name="canva">The canva.</param> /// <param name="visibleStart">The visible map area start.</param> /// <param name="visibleFinish">The visible map area finish.</param> internal void ShowMonster(IGraphic canva, Point visibleStart, Point visibleFinish) { if (_currentBaseParams.Invisible) return; if (!InVisibleMapArea(visibleStart, visibleFinish)) return; //Unit picture Bitmap tmp = _params[GetDirection, _movingPhase]; //Real coords calculating int realX = Settings.DeltaX + (int)((_canvaPos.X - visibleStart.X * Settings.ElemSize) * Scaling); int realY = Settings.DeltaY + (int)((_canvaPos.Y - visibleStart.Y * Settings.ElemSize) * Scaling); canva.DrawImage(tmp, (int)(realX - (tmp.Width / 2.0) * Scaling), (int)(realY - (tmp.Height / 2.0) * Scaling), (int)(tmp.Width * Scaling), (int)(tmp.Height * Scaling)); #region Effect Colors int r = 0; int g = 0; int b = 0; foreach (var effect in _effects)//Effects visualization { r += effect.EffectColor.R; g += effect.EffectColor.G; b += effect.EffectColor.B; } if (r != 0 || g != 0 || b != 0) canva.FillEllipse(new SolidBrush(Color.FromArgb((byte)r, (byte)g, (byte)b)), realX - 5 * Scaling, realY - 5 * Scaling, 10 * Scaling, 10 * Scaling); #endregion Effect Colors //HP bar showing int hpLineLength = (int)(Math.Round(_currentBaseParams.HealthPoints * 100.0 / _params.Base.HealthPoints) / 10.0); if (hpLineLength < 0) hpLineLength = 0; switch (GetDirection) { case MonsterDirection.Left: case MonsterDirection.Right: canva.DrawLine(Helpers.BlackPen, realX - 5 * Scaling, realY, realX + 5 * Scaling, realY); if (hpLineLength == 0) break; canva.DrawLine(Helpers.GreenPen, realX - 5 * Scaling, realY, realX + (-5 + hpLineLength) * Scaling, realY); break; case MonsterDirection.Up: case MonsterDirection.Down: canva.DrawLine(Helpers.BlackPen, realX, realY + 5 * Scaling, realX, realY - 5 * Scaling); if (hpLineLength == 0) break; canva.DrawLine(Helpers.GreenPen, realX, realY - 5 * Scaling, realX, realY + (-5 + hpLineLength) * Scaling); break; } }