private void DetectCollisions()
        {
            var bulletCollisionDetector       = new AABBCollisionDetector <BulletSprite, BaseGameObject>(_bulletList);
            var missileCollisionDetector      = new AABBCollisionDetector <MissileSprite, BaseGameObject>(_missileList);
            var playerCollisionDetector       = new AABBCollisionDetector <ChopperSprite, PlayerSprite>(_enemyList);
            var turretBulletCollisionDetector = new SegmentAABBCollisionDetector <PlayerSprite>(_playerSprite);

            bulletCollisionDetector.DetectCollisions(_enemyList, (bullet, chopper) =>
            {
                var hitEvent = new GameplayEvents.ObjectHitBy(bullet);
                chopper.OnNotify(hitEvent);
                _soundManager.OnNotify(hitEvent);
                bullet.Destroy();
            });

            missileCollisionDetector.DetectCollisions(_enemyList, (missile, chopper) =>
            {
                var hitEvent = new GameplayEvents.ObjectHitBy(missile);
                chopper.OnNotify(hitEvent);
                _soundManager.OnNotify(hitEvent);
                missile.Destroy();
            });

            bulletCollisionDetector.DetectCollisions(_turretList, (bullet, turret) =>
            {
                var hitEvent = new GameplayEvents.ObjectHitBy(bullet);
                turret.OnNotify(hitEvent);
                _soundManager.OnNotify(hitEvent);
                bullet.Destroy();
            });

            missileCollisionDetector.DetectCollisions(_turretList, (missile, turret) =>
            {
                var hitEvent = new GameplayEvents.ObjectHitBy(missile);
                turret.OnNotify(hitEvent);
                _soundManager.OnNotify(hitEvent);
                missile.Destroy();
            });

            if (!_playerDead)
            {
                var segments = new List <Segment>();
                foreach (var bullet in _turretBulletList)
                {
                    segments.Add(bullet.CollisionSegment);
                }

                turretBulletCollisionDetector.DetectCollisions(segments, _ =>
                {
                    KillPlayer();
                });

                playerCollisionDetector.DetectCollisions(_playerSprite, (chopper, player) =>
                {
                    KillPlayer();
                });
            }
        }
        private void HandleCollision(BaseGameObject hitBy, BaseGameObject hitObject)
        {
            // only allow hitting objects if the projectile is still on the screen. Otherwise we can
            // destroy turrets before they show up
            if (hitBy is IGameObjectWithDamage && hitBy.Position.Y >= 0)
            {
                var projectile = (IGameObjectWithDamage)hitBy;
                var hitEvent   = new GameplayEvents.ObjectHitBy(projectile);

                hitObject.OnNotify(hitEvent);
                _soundManager.OnNotify(hitEvent);
            }
        }