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;
                        }
                    }
                }
            }
        }
Exemple #2
0
        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);
        }