/// <summary> /// Allows the game to run logic such as updating the world, /// checking for collisions, gathering input, and playing audio. /// </summary> /// <param name="gameTime">Provides a snapshot of timing values.</param> protected override void Update(GameTime gameTime) { #if DEBUG SpartaDebug.Update(gameTime); #endif #if WINDOWS_PHONE SpartaTouch.Update(); #endif #if WINDOWS SpartaMouse.Update(); SpartaKeyboard.Update(); #endif bool backButtonPressed = GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed; DeltaTime = (float)gameTime.ElapsedGameTime.TotalSeconds; if (states.Count > 0) { SpartaState toBeRemoved = null; SpartaState[] spartaStates = states.Array; int count = states.Count; for (int i = 0; i < count; i++) { switch (spartaStates[i].Mode) { case SpartaState.SpartaStateMode.Activated: if (backButtonPressed) { spartaStates[i].OnBackButtonPressed(); } spartaStates[i].Update(gameTime); break; case SpartaState.SpartaStateMode.Loading: spartaStates[i].Initialize(); spartaStates[i].LoadContent(); if (spartaStates[i].TransitionIn.transitionType == SpartaTransitionType.None && spartaStates[i].TransitionOut.transitionType == SpartaTransitionType.None) { spartaStates[i].Mode = SpartaState.SpartaStateMode.Activated; } else if (spartaStates[i].TransitionIn.transitionType != SpartaTransitionType.None) { spartaStates[i].Mode = SpartaState.SpartaStateMode.TransitionIn; } else { spartaStates[i].Mode = SpartaState.SpartaStateMode.TransitionOff; } spartaStates[i].Update(gameTime); break; case SpartaState.SpartaStateMode.TransitionIn: spartaStates[i].Update(gameTime); break; case SpartaState.SpartaStateMode.TransitionOff: spartaStates[i].Update(gameTime); break; case SpartaState.SpartaStateMode.Deactivated: spartaStates[i].UnloadContent(); toBeRemoved = spartaStates[i]; break; } } if (toBeRemoved != null) { states.Remove(toBeRemoved); toBeRemoved.Dispose(); toBeRemoved = null; } } }
public override void Update(GameTime gameTime, Matrix?parentTransform) { base.Update(gameTime, parentTransform); Matrix.CreateTranslation(ContentsOffset.X, ContentsOffset.Y, 0f, out ContentsTransform); if (UserInputEnabled) { TouchCollection touches = SpartaTouch.TouchCollection; if (touches.Count > 0) { TouchLocation touch = touches[0]; TouchLocationState touchState = touch.State; Vector2 touchPosition = touch.Position; if (parentTransform.HasValue) { Matrix inverse = Matrix.Invert(parentTransform.Value); Vector2.Transform(ref touchPosition, ref inverse, out touchPosition); } bool boundingBoxContainsPoint = BoundingBox.Contains((int)touchPosition.X, (int)touchPosition.Y); switch (touchState) { case TouchLocationState.Pressed: if (boundingBoxContainsPoint) { deltas.Clear(); if (State == FlickableState.Steady) { State = FlickableState.Pressed; previousPoint = touchPosition; } else if (State == FlickableState.AutoScroll) { State = FlickableState.Stop; ScrollVelocity = DefaultScrollVelocity; previousPoint = touchPosition; Slowing = false; } SpartaTouch.Accept(); } break; case TouchLocationState.Moved: if (boundingBoxContainsPoint && (State == FlickableState.Pressed || State == FlickableState.Stop)) { ScrollVelocity = DefaultScrollVelocity; Vector2 delta = touchPosition - previousPoint; if (delta.X > Threshold || delta.X < -Threshold || delta.Y > Threshold || delta.Y < -Threshold) { State = FlickableState.ManualScroll; previousPoint = touchPosition; } } else if (State == FlickableState.ManualScroll) { Vector2 delta = touchPosition - previousPoint; float value = ScrollMode == FlickableScrollMode.Horizontally ? delta.X : delta.Y; deltas.Add(value); ScrollVelocity = value; previousPoint = touchPosition; } break; case TouchLocationState.Released: case TouchLocationState.Invalid: if (State == FlickableState.Pressed || State == FlickableState.Stop) { State = FlickableState.Steady; ScrollVelocity = DefaultScrollVelocity; } else if (State == FlickableState.ManualScroll) { ScrollVelocity = deltas.Sum() / deltas.Count; previousPoint = touchPosition; if (ScrollVelocity == 0f) { State = FlickableState.Steady; ScrollVelocity = DefaultScrollVelocity; } else { State = FlickableState.AutoScroll; Slowing = true; } } break; } } } if (Slowing) { ScrollVelocity = Deaccelerate(ScrollVelocity, 1, MaximumScrollVelocity); if (ScrollVelocity == 0f) { State = FlickableState.Steady; ScrollVelocity = DefaultScrollVelocity; Slowing = false; } } if (!float.IsNaN(ScrollVelocity)) { if (ScrollMode == FlickableScrollMode.Horizontally) { contentsOffset.X += ScrollVelocity; } else { contentsOffset.Y += ScrollVelocity; } } else { ScrollVelocity = DefaultScrollVelocity; } if (LoopingMode) { if (contentsOffset.X < -ContentsWidth) { contentsOffset.X = Width + (contentsOffset.X + ContentsWidth); } else if (contentsOffset.X > Width) { contentsOffset.X = -ContentsWidth + (contentsOffset.X - Width); } if (contentsOffset.Y < -ContentsHeight) { contentsOffset.Y = Height + (contentsOffset.Y + ContentsHeight); } else if (contentsOffset.Y > Height) { contentsOffset.Y = -ContentsHeight + (contentsOffset.Y - Height); } } else { if (contentsOffset.X < -ContentsWidth + Width) { contentsOffset.X = -ContentsWidth + Width; } else if (contentsOffset.X > 0f) { contentsOffset.X = 0f; } if (contentsOffset.Y < -ContentsHeight + Height) { contentsOffset.Y = -ContentsHeight + Height; } else if (contentsOffset.Y > 0f) { contentsOffset.Y = 0f; } } }