public World(int tick, double width, double height, Player[] players, Obstacle[] obstacles, Tank[] tanks, Shell[] shells, Bonus[] bonuses) { this.tick = tick; this.width = width; this.height = height; this.players = new Player[players.Length]; Array.Copy(players, this.players, players.Length); this.obstacles = new Obstacle[obstacles.Length]; Array.Copy(obstacles, this.obstacles, obstacles.Length); this.tanks = new Tank[tanks.Length]; Array.Copy(tanks, this.tanks, tanks.Length); this.shells = new Shell[shells.Length]; Array.Copy(shells, this.shells, shells.Length); this.bonuses = new Bonus[bonuses.Length]; Array.Copy(bonuses, this.bonuses, bonuses.Length); }
// returns - 0 - не пересекает, 1 - пересекает, 2 - пересекает, но есть шанс уклониться private int CheckToBeWoundedBy(Shell shell, Tank self, int speedK = 2) { // speedK == 2 - двигаться как обычно // speedK == 0 - стоять // speedL == 1 - вперёд // speedK == -1 - назад int steps = 0; double x = shell.X, y = shell.Y; Tank t = null; double selfDx = SelfSpeed * Math.Cos(self.Angle); double selfDy = SelfSpeed * Math.Sin(self.Angle); while (x >= 0 && x < world.Width && y >= 0 && y < world.Height) { if (t == null || !OutOfRange(t, 0.9)) { if (speedK == 2) t = new Tank(0, "", 0, steps * self.SpeedX + self.X, steps * self.SpeedY + self.Y, self.SpeedX, self.SpeedY, self.Angle, self.AngularSpeed, self.TurretRelativeAngle, self.CrewHealth, self.HullDurability, self.ReloadingTime, self.RemainingReloadingTime, self.PremiumShellCount, self.IsTeammate, self.Type); else if (speedK == 0) t = self; else t = new Tank(0, "", 0, steps * selfDx * speedK + self.X, steps * selfDy * speedK + self.Y, self.SpeedX, self.SpeedY, self.Angle, self.AngularSpeed, self.TurretRelativeAngle, self.CrewHealth, self.HullDurability, self.ReloadingTime, self.RemainingReloadingTime, self.PremiumShellCount, self.IsTeammate, self.Type); } int inunit = InUnit(t, x, y, 1.2); if (inunit != -1) { if (shell.Type == ShellType.Premium) return 1; double angle = Math.Abs(NormAngle(self.Angle - shell.Angle)); if (angle > Angle[90]) angle = Angle[180] - angle; if (inunit == 0 || inunit == 2) return 2; if (angle > Angle[20]) return 1; return 0; } x += shell.SpeedX; y += shell.SpeedY; steps++; } return 0; }