/// <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; }
/// <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); }