private void RunEnemis() { enemiTargets.Clear(); tempEn.Clear(); foreach (Enemi i in enemis) { if (i.X + i.Enemi_x > real_x && i.X < real_x + desc_Size_x && i.Y + i.Enemi_y > real_y && i.Y < real_y + desc_Size_y) { if (i.Status != EnemiStatus.Death) { i.Status = EnemiStatus.Playing; } } else { if (i.Status != EnemiStatus.Death) { i.Status = EnemiStatus.NotView; i.Search = false; } else { tempEn.Add(i); } } } foreach (Enemi i in tempEn) { enemis.Remove(i); } foreach (Enemi i in enemis.FindAll(r => r.Status == EnemiStatus.Playing)) { //if (Math.Abs(termin.Real_x - i.X) < 300 && Math.Abs(termin.Real_y - i.Y) < 300) //{ if (i.Search || Crosser.Iscross(i, termin, walls)) { i.Search = true; i.RunToTermin(termin.Real_x + termin.Termin_x / 2, termin.Real_y + termin.Termin_y / 2); if (i.TargetDelay == 0) { EnemiFire(i); } } else { i.RunRandom(); } //} //else // i.RunRandom(); i.TurnAround(enemis.FindAll(r => r != i && r.Status == EnemiStatus.Playing && Math.Abs(r.X - i.X) < 100 && Math.Abs(r.Y - i.Y) < 100)); i.Run(); } }
internal void InitLine(List <Rectangle> rects) { List <Point> tempPoints = new List <Point>(); foreach (Rectangle r in rects) { tempPoints.AddRange(Crosser.LineToRect(r, new Point(start_x, start_y), new Point(end_x, end_y))); } foreach (Point i in tempPoints) { if (Math.Abs(i.X - start_x) <= Math.Abs(end_x - start_x) && Math.Abs(i.Y - start_y) <= Math.Abs(end_y - start_y)) { end_x = (int)i.X; end_y = (int)i.Y; } } }
private void EnemiFire(Enemi e) { Target tempTarget = new Target(); tempTarget.Start_x = e.X + e.Enemi_x / 2 + e.Direct_x * e.Enemi_x / 2; tempTarget.Start_y = e.Y + e.Enemi_y / 2 + e.Direct_y * e.Enemi_y / 2; Point tempPoint = Crosser.SmallLine(tempTarget.Start_x, tempTarget.Start_y, termin); tempTarget.End_x = tempPoint.X; tempTarget.End_y = tempPoint.Y; int tx1 = Math.Min(tempTarget.Start_x, tempTarget.End_x); int tx2 = Math.Max(tempTarget.Start_x, tempTarget.End_x); int ty1 = Math.Min(tempTarget.Start_y, tempTarget.End_y); int ty2 = Math.Max(tempTarget.Start_y, tempTarget.End_y); Rectangle trect = new Rectangle(tx1, ty1, tx2 - tx1, ty2 - ty1); List <Rectangle> rects = new List <Rectangle>(); foreach (Wall i in walls.FindAll(r => trect.IntersectsWith(new Rectangle(r.X1, r.Y1, r.X2 - r.X1, r.Y2 - r.Y1)))) { rects.Add(new Rectangle(i.X1, i.Y1, i.X2 - i.X1, i.Y2 - i.Y1)); } foreach (Enemi i in enemis.FindAll(r => r != e && r.Status == EnemiStatus.Playing && trect.IntersectsWith(new Rectangle(r.X, r.Y, r.Enemi_x, r.Enemi_y)))) { rects.Add(new Rectangle(i.X, i.Y, i.Enemi_x, i.Enemi_y)); } rects.Add(new Rectangle(termin.Real_x, termin.Real_y, termin.Termin_x, termin.Termin_y)); if (rects.Count != 0) { tempTarget.InitLine(rects); } enemiTargets.Add(tempTarget); e.TargetDelay = 5; if (tempTarget.End_x >= termin.Real_x && tempTarget.End_x <= termin.Real_x + termin.Termin_x && tempTarget.End_y >= termin.Real_y && tempTarget.End_y <= termin.Real_y + termin.Termin_y && termin.HurtTermin == 0) { termin.Life--; termin.HurtTermin = termin.HurtTerminTime; } }