// add a projectile public void AddProjectile(Missile _p) { projectiles.Add(_p); addShapes(_p.Shapes); }
// remove an explosion /*public void RemoveExplosion(Explosion _e) { * explosions.Remove(_e); * removeShapes(_e.Shapes); * }*/ // advance game state by amount of time public void Advance(double dt) { // advance each projectile foreach (Missile _p in projectiles) { //Debug.WriteLine(string.Format("{0} advanced", _p)); _p.Advance(dt); } // advance each explosion foreach (Explosion _e in explosions) { _e.Advance(dt); } // collision checks foreach (Missile _p in projectiles) { // only check if not destroyed // and if projectile is capable of collision if (!_p.Destroyed && _p.Collidable) { // check against each explosion foreach (Explosion _e in explosions) { // check if projectile collided if (_p.Collided(_e)) { // break inner loop // destroyed check below will handle cleanup break; } } } } // not using foreach/list.RemoveAll(_p => _p.destroyed), etc // because would be too inoptimal for what is needed // list to gather shapes to remove List <Shape> _toRemove = new List <Shape>(); // check for destroyed projectiles // loop backwards to handle index shifting from RemoveAt for (int _i = projectiles.Count - 1; _i >= 0; --_i) { Missile _p = projectiles[_i]; if (_p.Destroyed) { projectiles.RemoveAt(_i); _toRemove.AddRange(_p.Shapes); // add explosion object from projectile if exists Explosion _e = _p.ExplosionObj; if (_e != null) { AddExplosion(_e); } // if was an IPBM, decrement incomingMissilesUp if (_p is IPBMissle) { //--incomingMissilesUp; // shouldn't go negative but just in case incomingMissilesUp = Math.Max(incomingMissilesUp - 1, 0); // if destroyed reason collided, add score if (_p.DestroyedType == MissileDestroyedType.Collided) { int _scoreAdd = settings.ScoreEnemyMissile * scoreMultiplier; score += _scoreAdd; remainingScore -= _scoreAdd; } } } } // check for inactive explosions for (int _i = explosions.Count - 1; _i >= 0; --_i) { Explosion _e = explosions[_i]; if (!_e.Active) { explosions.RemoveAt(_i); _toRemove.Add(_e.ExplosionShape); } } // check for destroyed targets for (int _i = targets.Count - 1; _i >= 0; --_i) { ITarget _t = targets[_i]; if (_t.Destroyed) { targets.RemoveAt(_i); _toRemove.Add(_t.DisplayShape); } } // call remove shapes event removeShapes(_toRemove); // advance game time gameTime += dt; // check level CheckLevel(dt); }
// tell city is has been impacted by projectile public void Impacted(Missile _p) { // just set destroyed destroyed = true; }