private void HandleBulletCollisions(GameTime gameTime) { for (int index = 0; index < battle.Bullets.Count; index++) { Bullet bullet = battle.Bullets[index]; Vector2 positionInTiles = bullet.Position / GameSettings.TileSize; if (!battle.Map.IsOnMap((int)positionInTiles.X, (int)positionInTiles.Y)) // If the bullet is off the map { battle.Bullets.RemoveAt(index); index--; continue; } foreach (Mech mech in battle.AllMechs) { if (!mech.IsAlive || bullet.ShooterTeam.Mechs.Contains(mech)) { continue; } if ((mech.Position - bullet.Position).LengthSquared() < GameSettings.TileSize * Math.Max(mech.Size.X, mech.Size.Y)) { CollisionReport report = CollisionDetector.DetectCollision(bullet, mech, gameTime); if (report.CollisionOccured == true) { ScrapWarsEventManager.GetManager().SendEvent(new BulletHitMechEvent(mech, bullet)); battle.Bullets.RemoveAt(index); index--; break; } } } } }
public static CollisionReport DetectCollision(CollisionObject objectOne, CollisionObject objectTwo, GameTime gameTime) { CollisionObject mainObject; CollisionObject secondObject; CollisionReport report = new CollisionReport(objectOne, objectTwo); if (objectOne.ColorArray.Length < objectTwo.ColorArray.Length) // This is to minimize the number of pixels examined { mainObject = objectOne; secondObject = objectTwo; } else { mainObject = objectTwo; secondObject = objectOne; } float stepSize = 0.001f; for (int stepNum = 0; stepNum < gameTime.ElapsedGameTime.Milliseconds / 1000.0f / stepSize; stepNum++) { for (int x = 0; x < mainObject.ColorArray.GetLength(0); x++) { for (int y = 0; y < mainObject.ColorArray.GetLength(1); y++) { Vector2 colorScreenPosition = mainObject.GetTransformedScreenPosition(x, y); Color colorOne = mainObject.ColorArray[x, y]; Color colorTwo = secondObject.GetColorAtScreenPosition((int)colorScreenPosition.X, (int)colorScreenPosition.Y); if (colorOne.A > 0 && colorTwo.A > 0) { report.RecordCollision(colorScreenPosition); return(report); } } } mainObject.Step(stepSize); } return(report); }