/// <summary> /// Set the current spotlight animation transition. /// Make sure when calling this that it is in an appropriate context and will not cause a jarring reset on animated transition change. /// </summary> /// <param name="transition">Enumerated value denoting what transition to perform.</param> public static void ExecuteViewMotionTransition(SpotlightMotionTransition transition, Vector2 modification) { currentSpotlightAnimatedTransition = transition; // Perform Conditional Transition Setup switch (transition) { case SpotlightMotionTransition.WorldViewToPlayer: offset = modification; zoom = minZoom; EnforceZoomLimits(); EnforceStageBoundaries(); // redundancy protection SavedDataIsValid = false; ViewMotionTransitionZoomingIn = false; if (currentFocusTarget != null) ViewMotionInformationVector = currentFocusTarget.Position(); break; case SpotlightMotionTransition.FlickToScroll: modification.Normalize(); modification *= (400 / zoom); ViewMotionInformationVector = offset - modification; break; case SpotlightMotionTransition.FullZoomAroundPoint: ViewMotionTransitionZoomingIn = (zoom > (minZoom + maxZoom) / 2); int numSteps = (int)((ViewMotionTransitionZoomingIn) ? (zoom - maxZoom) / ZoomStep : (minZoom - zoom) / ZoomStep); Vector2 center = offset + new Vector2(halfScreenWidth, halfScreenHeight); ViewMotionInformationVector = (TranslateScreenVectorToWorldVector(modification) - center) / numSteps; break; default: break; } }
public static void TemporaryZoomOnObject(WorldObject newFocus, Vector2 fingerLocation) { if (zoom < 1.3f) { savedZoom = zoom; minZoom = 1.3f; zoom = 1.3f; savedFocusTarget = currentFocusTarget; currentFocusTarget = newFocus; Point bounds = newFocus.Center(); offset = new Vector2(bounds.X - (fingerLocation.X/zoom), bounds.Y - (fingerLocation.Y/zoom)); currentSpotlightAnimatedTransition = SpotlightMotionTransition.None; } else { if (fingerLocation.X < 50) { offset.X -= 15; } if (fingerLocation.X > 750) { offset.X += 15; } if (fingerLocation.Y < 50) { offset.Y -= 15; } if (fingerLocation.Y > 430) { offset.Y += 15; } EnforceStageBoundaries(); } }
/// <summary> /// Update the SpotlightMotionTransition if one is active /// </summary> private static void UpdateSpotlightMotionTransition() { switch (currentSpotlightAnimatedTransition) { case SpotlightMotionTransition.None: return; case SpotlightMotionTransition.WorldViewToPlayer: miniAdjustStageZoomLevel(!ViewMotionTransitionZoomingIn); offset = Vector2.Lerp(offset, ViewMotionInformationVector, 0.5f); if (zoom <= maxZoom) ViewMotionTransitionZoomingIn = true; if (zoom >= minZoom) currentSpotlightAnimatedTransition = SpotlightMotionTransition.None; break; case SpotlightMotionTransition.FlickToScroll: offset = Vector2.Lerp(offset, ViewMotionInformationVector, 0.1f); if (Vector2.Distance(offset, ViewMotionInformationVector) < 5.0f) currentSpotlightAnimatedTransition = SpotlightMotionTransition.None; break; case SpotlightMotionTransition.FullZoomAroundPoint: AdjustStageZoomLevel(ViewMotionTransitionZoomingIn); offset += ViewMotionInformationVector; if (zoom == maxZoom || zoom == minZoom) currentSpotlightAnimatedTransition = SpotlightMotionTransition.None; break; default: break; } }
/// <summary> /// Process a gesture sample. /// </summary> /// <param name="gesture"></param> public static void ProcessTouch(GestureSample gesture) { switch (gesture.GestureType) { case GestureType.Pinch: float deltaSpace = Vector2.Distance(gesture.Position, gesture.Position2); if (lastDeltaSpace != 0) { if (lastDeltaSpace == deltaSpace) return; AdjustStageZoomLevel(lastDeltaSpace > deltaSpace); } lastDeltaSpace = deltaSpace; break; case GestureType.FreeDrag: offset -= gesture.Delta; EnforceStageBoundaries(); currentSpotlightAnimatedTransition = SpotlightMotionTransition.None; break; case GestureType.Tap: currentSpotlightAnimatedTransition = SpotlightMotionTransition.None; break; case GestureType.Flick: ExecuteViewMotionTransition(SpotlightMotionTransition.FlickToScroll, gesture.Delta); break; case GestureType.DoubleTap: ExecuteViewMotionTransition(SpotlightMotionTransition.FullZoomAroundPoint, gesture.Position); break; default: break; } }