コード例 #1
0
 // add a projectile
 public void AddProjectile(Missile _p)
 {
     projectiles.Add(_p);
     addShapes(_p.Shapes);
 }
コード例 #2
0
        // 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);
        }
コード例 #3
0
ファイル: GameOther.cs プロジェクト: Droo-k6/School
 // tell city is has been impacted by projectile
 public void Impacted(Missile _p)
 {
     // just set destroyed
     destroyed = true;
 }