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; } }
public static bool Iscross(Enemi i, Termin termin, List <Wall> walls) { int i2x, i2y, i1x, i1y; i1x = Math.Min(i.X + i.Enemi_x / 2, termin.Real_x + termin.Termin_x / 2); i1y = Math.Min(i.Y + i.Enemi_y / 2, termin.Real_y + termin.Termin_y / 2); i2x = Math.Abs(i.X + i.Enemi_x / 2 - termin.Real_x - termin.Termin_x / 2); i2y = Math.Abs(i.Y + i.Enemi_y / 2 - termin.Real_y - termin.Termin_y / 2); Rectangle tr = new Rectangle(i1x, i1y, i2x, i2y); bool bol = true; foreach (Wall j in walls) { Rectangle t1 = new Rectangle(j.X1, j.Y1, j.X2 - j.X1, j.Y2 - j.Y1); if (tr.IntersectsWith(t1)) { if (LineToRectFunct(j.X1, j.Y1, j.X2, j.Y2, i1x, i1y, i1x + i2x, i1y + i2y).Count > 0) { bol = false; } } } return(bol); }