示例#1
0
        /// <summary>
        /// Returns the proper animation for the given tile
        /// </summary>
        /// <param name="name">Name of the tile that needs to be animated</param>
        /// <returns></returns>
        private AnimatedSprite GetAnimation(string name)
        {
            var concatName = name.Substring(name.LastIndexOf('\\') + 1);
            var newAnimation = new AnimatedSprite();

            _wallEngine.ColorScheme = concatName;

            switch (concatName)
            {
                case "Green":
                    if(_mUseVert)
                        newAnimation.Load(_mContent, "GreenVert", 4, 0.15f);
                    else newAnimation.Load(_mContent, "GreenHor", 4, 0.15f);
                    _mUseVert = !_mUseVert;
                    break;
                case "Pink":
                    if(_mUseVert)
                        newAnimation.Load(_mContent, "PinkVert", 4, 0.15f);
                    else newAnimation.Load(_mContent, "PinkHor", 4, 0.15f);
                    _mUseVert = !_mUseVert;
                    break;
                case "Blue":
                    if(_mUseVert)
                        newAnimation.Load(_mContent, "BlueVert", 4, 0.15f);
                    else newAnimation.Load(_mContent, "BlueHor", 4, 0.15f);
                    _mUseVert = !_mUseVert;
                    break;
                case "Yellow":
                    if(_mUseVert)
                        newAnimation.Load(_mContent, "YellowVert", 4, 0.15f);
                    else newAnimation.Load(_mContent, "YellowHor", 4, 0.15f);
                    _mUseVert = !_mUseVert;
                    break;
                case "Purple":
                    if(_mUseVert)
                        newAnimation.Load(_mContent, "PurpleVert", 4, 0.15f);
                    else newAnimation.Load(_mContent, "PurpleHor", 4, 0.15f);
                    _mUseVert = !_mUseVert;
                    break;
                case "Orange":
                    if(_mUseVert)
                        newAnimation.Load(_mContent, "OrangeVert", 4, 0.15f);
                    else newAnimation.Load(_mContent, "OrangeHor", 4, 0.15f);
                    _mUseVert = !_mUseVert;
                    break;
                case "GreenDiamond":
                    newAnimation.Load(_mContent, "GreenDiamond", 3, 0.225f);
                    break;
                case "BlueDiamond":
                    newAnimation.Load(_mContent, "BlueDiamond", 3, 0.225f);
                    break;
                case "OrangeDiamond":
                    newAnimation.Load(_mContent, "OrangeDiamond", 3, 0.225f);
                    break;
                case "PinkDiamond":
                    newAnimation.Load(_mContent, "PinkDiamond", 3, 0.225f);
                    break;
                case "PurpleDiamond":
                    newAnimation.Load(_mContent, "PurpleDiamond", 3, 0.225f);
                    break;
                case "YellowDiamond":
                    newAnimation.Load(_mContent, "YellowDiamond", 3, 0.225f);
                    break;
                case "BlueGem":
                    newAnimation.Load(_mContent, "BlueGem", 6, 0.15f);
                    break;
                case "OrangeGem":
                    newAnimation.Load(_mContent, "OrangeGem", 6, 0.15f);
                    break;
                case "PinkGem":
                    newAnimation.Load(_mContent, "PinkGem", 6, 0.15f);
                    break;
                case "PurpleGem":
                    newAnimation.Load(_mContent, "PurpleGem", 6, 0.15f);
                    break;
                case "GreenGem":
                    newAnimation.Load(_mContent, "GreenGem", 6, 0.15f);
                    break;
                case "YellowGem":
                    newAnimation.Load(_mContent, "YellowGem", 6, 0.15f);
                    break;
                case "MovingHazard":
                    newAnimation.Load(_mContent, "MovingHazard", 4, 0.15f);
                    break;
                case "ReverseMovingHazard":
                    newAnimation.Load(_mContent, "ReverseMovingHazard", 4, 0.15f);
                    break;
                default:
                    newAnimation.Load(_mContent, "NoAnimation", 1, 0.5f);
                    break;
            }
            return newAnimation;
        }
示例#2
0
        /// <summary>
        /// Updates the level's progress
        /// </summary>
        /// <param name="gameTime">The game time.</param>
        /// <param name="gameState">State of the game.</param>
        public void Update(GameTime gameTime, ref GameStates gameState)
        {
            if (_mPlayer.MIsAlive)// only update while player is alive
            {
                if (!_bw.IsBusy)
                    _bw.RunWorkerAsync();

                if (_mDeathState == DeathStates.Playing)
                {
                    MTimer += (gameTime.ElapsedGameTime.TotalSeconds);

                    if (_mPlayerEnd != null)
                        _mPlayerEnd.UpdateFace(MTimer);

                    foreach (var gObject in _mObjects)
                    {
                        if (gObject.CollisionType == XmlKeys.Collectable)
                        {
                            if (_mCollectableAnimation == null)
                            {
                                _mCollectableAnimation = GetAnimation(gObject.MName);
                            }
                            if (!_mCollectableLocations.Contains(gObject.MPosition))
                            {
                                _mCollectableLocations.Add(gObject.MPosition);
                            }
                        }
                        if (gObject.CollisionType == XmlKeys.Hazardous)
                        {
                            if (gObject is ReverseTile)
                            {
                                if (_mReverseHazardAnimation == null)
                                {
                                    _mReverseHazardAnimation = GetAnimation("ReverseMovingHazard");
                                }
                            }
                            else if (gObject is MovingTile)
                            {
                                if (_mHazardAnimation == null)
                                    _mHazardAnimation = GetAnimation("MovingHazard");
                            }
                        }
                        if (gObject is PhysicsObject)
                        {
                            var pObject = (PhysicsObject)gObject;

                            pObject.FixForBounds((int)Size.X, (int)Size.Y, IsMainMenu);
                            var oldPos = GridSpace.GetGridCoord(pObject.MPosition);

                            if (pObject is Player)
                            {
                                ((Player)pObject).CurrentTime = (int)MTimer;
                            }
                            pObject.Update(gameTime);

                            // Update zoom based on players velocity
                            pObject.FixForBounds((int)Size.X, (int)Size.Y, IsMainMenu);
                            UpdateCollisionMatrix(pObject, oldPos);

                            // handle collision right after you move
                            HandleCollisions(pObject, ref gameState);

                            if (pObject is Player)
                                foreach (var trigger in _mTrigger)
                                    trigger.RunTrigger(_mObjects, (Player)pObject);
                        }
                        if (!_mHasRespawned) break;
                    }

                    //Update wall animations
                    for(var i = 0; i < _mActiveAnimations.Count; i++)
                    {
                        var current = _mActiveAnimations.ElementAt(i);
                        current.Value.Update((float)gameTime.ElapsedGameTime.TotalSeconds);
                        if (current.Value.Frame == 0 && current.Value.PreviousFrame == current.Value.LastFrame - 1)
                            _mActiveAnimations.Remove(current.Key);
                    }

                    //Update collectable animations
                    if (_mCollectableAnimation != null)
                        _mCollectableAnimation.Update((float)gameTime.ElapsedGameTime.TotalSeconds);

                    //Update hazard animations
                    if (_mHazardAnimation != null)
                        _mHazardAnimation.Update((float)gameTime.ElapsedGameTime.TotalSeconds);

                    if (_mReverseHazardAnimation != null)
                        _mReverseHazardAnimation.Update((float)gameTime.ElapsedGameTime.TotalSeconds);

                    //Check to see if we collected anything
                    if (_mRemoveCollected.Count > 0)
                    {
                        MNumCollected = MNumCollectable - (MNumCollectable - _mCollected.Count());

                        //Safely remove the collected objects
                        foreach (var g in _mRemoveCollected)
                        {
                            RemoveFromMatrix(g);
                            _mObjects.Remove(g);
                            _mCollectableLocations.Remove(g.MPosition);
                        }

                        //Then clear the list
                        _mRemoveCollected.Clear();
                    }

                    //Update number of deaths occured
                    MDeaths = 5 - _mPlayer.MNumLives;

                    // Update the camera to keep the player at the center of the screen
                    // Also only update if the velocity if greater than 0.5f in either direction
                    if (!IsMainMenu && (Math.Abs(_mPlayer.ObjectVelocity.X) > 0.5f || Math.Abs(_mPlayer.ObjectVelocity.Y) > 0.5f))
                    {
                       MCam.Position = new Vector3(_mPlayer.Position.X - 275, _mPlayer.Position.Y - 175, 0);
                    }
                    else if(IsMainMenu)
                    {
                        MCam.Position = new Vector3(_mPlayer.SpawnPoint.X - 275, _mPlayer.SpawnPoint.Y - 100, 0);
                    }

                    //Pause
                    if (_mControls.IsStartPressed(false) || Guide.IsVisible)
                        if (gameState == GameStates.InGame)
                            gameState = GameStates.Pause;
                }

                else if (_mDeathState == DeathStates.Respawning)
                {
                    _mDeathState = DeathStates.Panning;
                    Respawn();
                }

                else//Pan back to player after death
                {
                    MCam.Position += _mDeathPanLength;
                    _mDeathPanUpdates++;

                    if (_mDeathPanUpdates == ScalingFactor)
                        _mDeathState = DeathStates.Playing;
                }
            }

            if (!_mPlayer.MIsAlive)
            {
                _mPlayer.StopRumble();
                if (_mControls.IsAPressed(false))// resets game after game over
                {
                    _mPlayer.MNumLives = 5;
                    _mPlayer.MIsAlive = true;
                    MNumCollected = 0;
                    MTimer = 0;

                    //Add the collected objects back to the object list
                    foreach (var collected in _mCollected)
                        _mObjects.Add(collected);

                    //Reset the collision matrix
                    PrepareCollisionMatrix();

                    //Clear the collection lists
                    _mCollected.Clear();
                    _mRemoveCollected.Clear();
                }
            }

            _collectibleEngine.Update(0);
            _wallEngine.Update(0);
        }