Beispiel #1
0
        /// <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;
                }
            }
        }
Beispiel #2
0
        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;
                }
            }
        }