public void AttemptMissileLaunch(double currentTime) { if (health <= 0) { return; } double timeSinceLastFired = currentTime - timeLastFiredMissile; if (timeSinceLastFired > firingInterval) { timeLastFiredMissile = currentTime; // avoid duplicating costly math ops float shipDirection = ShipOrientation; float cos = (float)Math.Cos(shipDirection); float sin = (float)Math.Sin(shipDirection); var position = new CGPoint(Position.X + missileLaunchDistance * cos, Position.Y + missileLaunchDistance * sin); SKNode missile = NodeFactory.CreateMissileNode(this); missile.Position = position; Scene.AddChild(missile); missile.PhysicsBody.Velocity = PhysicsBody.Velocity; var vector = new CGVector(missileLaunchImpulse * cos, missileLaunchImpulse * sin); missile.PhysicsBody.ApplyImpulse(vector); } }
static CGVector InterpolatedNormalUnitVector(CGVector vector1, CGVector vector2) { var n1 = vector1.Normal(); var n2 = vector2.Normal(); var result = (n1.Add(n2))?.Normalize(); if (result.HasValue) { return(result.Value); } // This means they resulted in a 0,0 vector, // in this case one of the incoming vectors is a good result. result = vector1.Normalize(); if (result.HasValue) { return(result.Value); } result = vector2.Normalize(); if (result.HasValue) { return(result.Value); } // This case should not happen. return(new CGVector(1, 0)); }
public override void TouchesBegan(NSSet touches, UIEvent evt) { base.TouchesBegan(touches, evt); if (spiderView == null) { return; } var spiderTouchRadius = spiderImage.Size.Width; var spiderTouchRadiusSq = spiderTouchRadius * spiderTouchRadius; foreach (UITouch touch in touches) { var position = touch.LocationInView(this); var dx = position.X - spiderView.Center.X; var dy = position.Y - spiderView.Center.Y; var distanceSq = dx * dx + dy * dy; if (distanceSq < spiderTouchRadiusSq) { var direction = new CGVector(anchorPoint.X - spiderView.Center.X, anchorPoint.Y - spiderView.Center.Y); applyForce(direction, touch.Force); break; } } }
void AnimateMenu(MenuState newMenuState, float initialVelocity = 0.7f) { var initialVelocityVector = new CGVector(initialVelocity, 0f); var springParameters = GetSpringTimingParameters(initialVelocityVector); var shouldMaximize = newMenuState == MenuState.Open; menuAnimator = new UIViewPropertyAnimator(0, springParameters) { Interruptible = true, }; menuAnimator.AddAnimations(() => { menuViewController.View.Frame = new CGRect { Location = new CGPoint { X = MenuDestinationXFromState(newMenuState), Y = 0f, }, Size = menuViewController.View.Frame.Size, }; menuViewController.SetPercentMaximized(shouldMaximize ? 1 : 0); menuBackgroundView.Alpha = shouldMaximize ? 1 : 0; }); menuAnimator.AddCompletion(pos => menuState = shouldMaximize ? MenuState.Open : MenuState.Closed); menuAnimator.StartAnimation(); }
private void processAccelerometerData(CMAccelerometerData data, NSError error) { if (spiderView == null) { return; } var ax = data.Acceleration.X; var ay = data.Acceleration.Y; var angle = -(nfloat)Math.Atan2(ay, ax); gravity.Angle = angle; if (previousAcceleration.HasValue) { var dx = (nfloat)(ax - previousAcceleration.Value.X); var dy = (nfloat)(ay - previousAcceleration.Value.Y); var direction = new CGVector(dx, dy); var magnitude = (nfloat)Math.Sqrt(dx * dx + dy * dy); if (magnitude > 0.25f) { applyForce(direction, magnitude); } } previousAcceleration = data.Acceleration; }
/// <summary> /// Bullets Actions /// </summary> public CGVector GetRotation(CGVector vector, double angle) { var rotatedX = vector.dx * Math.Cos(angle) - vector.dy * Math.Sin(angle); var rotatedY = vector.dx * Math.Cos(angle) + vector.dy * Math.Cos(angle); return(new CGVector((nfloat)rotatedX, (nfloat)rotatedY)); }
private void processAccelerometerData(CMAccelerometerData data, NSError error) { if (spiderView == null) { return; } var(ax, ay) = convertXYCoordinate(data.Acceleration.X, data.Acceleration.Y, UIApplication.SharedApplication.StatusBarOrientation); var angle = -(nfloat)Math.Atan2(ay, ax); gravity.Angle = angle; if (previousAcceleration.HasValue) { var(previousX, previousY) = convertXYCoordinate(previousAcceleration.Value.X, previousAcceleration.Value.Y, UIApplication.SharedApplication.StatusBarOrientation); var dx = (nfloat)(ax - previousX); var dy = (nfloat)(ay - previousY); var direction = new CGVector(dx, dy); var magnitude = (nfloat)Math.Sqrt(dx * dx + dy * dy); if (magnitude > 0.25f) { applyForce(direction, magnitude); } } previousAcceleration = data.Acceleration; }
private void applyForce(CGVector direction, nfloat magnitude) { var force = new UIPushBehavior(UIPushBehaviorMode.Instantaneous, spiderView); force.PushDirection = direction; force.Magnitude = magnitude; spiderAnimator.AddBehavior(force); }
public double InvLerp(CGPoint start, CGPoint end, CGPoint loc) { var a = new CGVector(end.X - start.X, end.Y - start.Y); var b = new CGVector(loc.X - start.X, loc.Y - start.Y); var dot = a.dx * b.dx + a.dy * b.dy; var len = Math.Sqrt(a.dx * a.dx + a.dy * a.dy); return(dot / len); }
public void ShootSpell(CGPoint position) { Cooldown = 100; var vector = new CGVector(position.X - Position.X, position.Y - Position.Y); var spell = ShotSprite.CreateShotAt(Position, SpellType.Enemy); Parent.AddChild(spell); spell.AttackByVector(vector); spell.ZRotation = (nfloat)Math.Atan2(vector.dy, vector.dx); }
public void ShootSpell(CGPoint position) { // Create vector of the movement var vector = new CGVector(position.X - Position.X, position.Y - Position.Y); // Create spell instance place it into the world and force it to attack var spell = ShotSprite.CreateShotAt(Position, SpellType.Hero); Parent.AddChild(spell); spell.AttackByVector(vector); spell.RunAction(SKAction.RepeatActionForever(SKAction.RotateByAngle((nfloat)6.28, 1))); }
public override void AnimateTransition(IUIViewControllerContextTransitioning transitionContext) { var fromViewController = transitionContext.GetViewControllerForKey(UITransitionContext.FromViewControllerKey); var toViewController = transitionContext.GetViewControllerForKey(UITransitionContext.ToViewControllerKey); UIView containerView = transitionContext.ContainerView; var fromView = transitionContext.GetViewFor(UITransitionContext.FromViewKey); var toView = transitionContext.GetViewFor(UITransitionContext.ToViewKey); var fromFrame = transitionContext.GetInitialFrameForViewController(fromViewController); var toFrame = transitionContext.GetFinalFrameForViewController(toViewController); var offset = new CGVector(0f, 0f); if (targetEdge == UIRectEdge.Left) { offset = new CGVector(-1f, 0f); } else if (targetEdge == UIRectEdge.Right) { offset = new CGVector(1f, 0f); } fromView.Frame = fromFrame; CGRect auxFrame = toFrame; auxFrame.Offset(toFrame.Width * offset.dx * -1f, toFrame.Height * offset.dy * -1f); toView.Frame = auxFrame; containerView.AddSubview(toView); var duration = TransitionDuration(transitionContext); UIView.Animate(duration, 0, UIViewAnimationOptions.TransitionNone, () => { var fromFrameAux = fromFrame; fromFrameAux.Offset(fromFrame.Width * offset.dx, fromFrame.Height * offset.dy); fromView.Frame = fromFrameAux; toView.Frame = toFrame; }, () => { transitionContext.CompleteTransition(!transitionContext.TransitionWasCancelled); } ); }
void AnimatePullout(PulloutState newPulloutState, float initialVelocity = 0.7f, bool launchKeyboard = false) { var initialVelocityVector = new CGVector(0f, initialVelocity); var springParameters = GetSpringTimingParameters(initialVelocityVector); var destinationY = PulloutDestinationYFromState(newPulloutState); pulloutAnimator = new UIViewPropertyAnimator(0, springParameters) { Interruptible = true, }; pulloutAnimator.AddAnimations(() => { mainPulloutView.Frame = new CGRect { Location = new CGPoint { X = mainPulloutView.Frame.X, Y = destinationY, }, Size = mainPulloutView.Frame.Size, }; mainPulloutView.SetPercentMaximized(newPulloutState == PulloutState.Maximized ? 1 : 0); mainPulloutView.SetPercentMinimized(newPulloutState == PulloutState.Neutral || newPulloutState == PulloutState.Maximized ? 0 : 1); pulloutBackgroundView.Alpha = newPulloutState == PulloutState.Maximized ? 1 : 0; }); if (launchKeyboard) { mainPulloutView.LaunchKeyboard(); } pulloutAnimator.AddCompletion(pos => { pulloutState = newPulloutState; mainPulloutView.PulloutDidFinishAnimating(newPulloutState); }); pulloutAnimator.StartAnimation(); }
void LayoutIndicatorForAzimuthAngle(nfloat azimuthAngle, CGVector azimuthUnitVector, nfloat altitudeAngle, CALayer targetLineLayer, CALayer targetDotLayer) { var reticleBounds = reticleLayer.Bounds; var centeringTransform = CGAffineTransform.MakeTranslation(reticleBounds.Width / 2f, reticleBounds.Height / 2f); var rotationTransform = CGAffineTransform.MakeRotation(azimuthAngle); // Draw the indicator opposite the azimuth by rotating pi radians, for easy visualization. rotationTransform = CGAffineTransform.Rotate(rotationTransform, NMath.PI); var altitudeRadius = (1f - altitudeAngle / NMath.PI / 2f) * radius; var lineTransform = CGAffineTransform.MakeScale(altitudeRadius, 1); lineTransform = CGAffineTransform.Multiply(lineTransform, rotationTransform); lineTransform = CGAffineTransform.Multiply(lineTransform, centeringTransform); targetLineLayer.AffineTransform = lineTransform; var dotTransform = CGAffineTransform.MakeTranslation(-azimuthUnitVector.dx * altitudeRadius, -azimuthUnitVector.dy * altitudeRadius); dotTransform = CGAffineTransform.Multiply(dotTransform, centeringTransform); targetDotLayer.AffineTransform = dotTransform; }
static CGVector InterpolatedNormalUnitVector (CGVector vector1, CGVector vector2) { var n1 = vector1.Normal (); var n2 = vector2.Normal (); var result = (n1.Add (n2))?.Normalize (); if (result.HasValue) return result.Value; // This means they resulted in a 0,0 vector, // in this case one of the incoming vectors is a good result. result = vector1.Normalize (); if (result.HasValue) return result.Value; result = vector2.Normalize (); if (result.HasValue) return result.Value; // This case should not happen. return new CGVector (1, 0); }
public static CGVector Apply(this CGVector vector, CGAffineTransform transform) { return(vector.CreatePoint().Apply(transform).CreateVector()); }
public static CGPoint CreatePoint(this CGVector self) { return(new CGPoint(self.dx, self.dy)); }
public void ToStringTest() { var vector = new CGVector((nfloat)1, (nfloat)2); Assert.AreEqual("{1, 2}", vector.ToString(), "ToString"); }
public static nfloat Quadrance(this CGVector vector) { return(vector.dx * vector.dx + vector.dy * vector.dy); }
void SetupRings(int itemCount) { // Define some nice colors. var borderColorSelected = UIColor.FromHSBA(0.07f, 0.81f, 0.98f, 1).CGColor; var borderColorNormal = UIColor.DarkGray.CGColor; var fillColorSelected = UIColor.FromHSBA(0.07f, 0.21f, 0.98f, 1); var fillColorNormal = UIColor.White; // We define generators to return closures which we use to define // the different states of our item ring views. Func <RingView, Action> selectedGenerator = (view) => () => { view.Layer.BorderColor = borderColorSelected; view.BackgroundColor = fillColorSelected; }; Func <RingView, Action> normalGenerator = (view) => () => { view.Layer.BorderColor = borderColorNormal; view.BackgroundColor = fillColorNormal; }; CGPoint startPosition = Bounds.GetCenter(); Func <RingView, Action> locationNormalGenerator = (view) => () => { view.Center = startPosition; if (!view.Selected) { view.Alpha = 0; } }; Func <RingView, CGVector, Action> locationFanGenerator = (view, offset) => () => { view.Center = startPosition.Add(offset); view.Alpha = 1; }; // tau is a full circle in radians var tau = NMath.PI * 2; var absoluteRingSegment = tau / 4; var requiredLengthPerRing = RingRadius * 2 + 5; var totalRequiredCirlceSegment = requiredLengthPerRing * (itemCount - 1); var fannedControlRadius = NMath.Max(requiredLengthPerRing, totalRequiredCirlceSegment / absoluteRingSegment); var normalDistance = new CGVector(0, -fannedControlRadius); var scale = UIScreen.MainScreen.Scale; // Setup our item views. for (int index = 0; index < itemCount; index++) { var view = new RingView(Bounds); view.StateClosures [Selected] = selectedGenerator(view); view.StateClosures [Normal] = normalGenerator(view); nfloat angle = index / (nfloat)(itemCount - 1) * absoluteRingSegment; var fan = normalDistance.Apply(MakeRotation(angle)).RoundTo(scale); view.StateClosures [LocationFan] = locationFanGenerator(view, fan); view.StateClosures [LocationOrigin] = locationNormalGenerator(view); AddSubview(view); RingViews.Add(view); var gr = new UITapGestureRecognizer(Tap); view.AddGestureRecognizer(gr); } // Setup the initial selection state. var rv = RingViews [0]; AddSubview(rv); rv.Selected = true; selectedView = rv; UpdateViews(animated: false); }
//public static void SetCenter (this CGRect rect) //{ // //origin = center - CGVector (dx: width, dy: height) / 2 //} public static CGPoint Add (this CGPoint left, CGVector right) { return new CGPoint (left.X + right.dx, left.Y + right.dy); }
public static CGVector?Normal(this CGVector self) { bool isZero = (self.dx == 0 && self.dy == 0); return(isZero ? (CGVector?)null : new CGVector(-self.dy, self.dx)); }
public static CGVector Mult(this CGVector left, nfloat right) { return(new CGVector(left.dx * right, left.dy * right)); }
public static CGVector RoundTo(this CGVector self, nfloat scale) { return(new CGVector(NMath.Round(self.dx * scale) / scale, NMath.Round(self.dy * scale) / scale)); }
float DistanceBetween(CGPoint p1, CGPoint p2) { var vector = new CGVector(p2.X - p1.X, p2.Y - p1.Y); return((float)Math.Sqrt(vector.dx * vector.dx + vector.dy * vector.dy)); }
public CGVector GetAzimuthUnitVector() { var unitVector = new CGVector(1, 1); return(unitVector.Apply(MakeRotation(Azimuth.Value))); }
/// <summary> /// Point the sprite to move by the vector /// </summary> /// <param name="vector">Vector.</param> public void AttackByVector(CGVector vector) { var time = Math.Sqrt(Math.Pow(vector.dx, 2) + Math.Pow(vector.dy, 2)) / 300; RunAction(SKAction.RepeatActionForever(SKAction.MoveBy(vector, time))); }
void SetupRings (int itemCount) { // Define some nice colors. var borderColorSelected = UIColor.FromHSBA (0.07f, 0.81f, 0.98f, 1).CGColor; var borderColorNormal = UIColor.DarkGray.CGColor; var fillColorSelected = UIColor.FromHSBA (0.07f, 0.21f, 0.98f, 1); var fillColorNormal = UIColor.White; // We define generators to return closures which we use to define // the different states of our item ring views. Func<RingView, Action> selectedGenerator = (view) => () => { view.Layer.BorderColor = borderColorSelected; view.BackgroundColor = fillColorSelected; }; Func<RingView, Action> normalGenerator = (view) => () => { view.Layer.BorderColor = borderColorNormal; view.BackgroundColor = fillColorNormal; }; CGPoint startPosition = Bounds.GetCenter (); Func<RingView, Action> locationNormalGenerator = (view) => () => { view.Center = startPosition; if (!view.Selected) view.Alpha = 0; }; Func<RingView, CGVector, Action> locationFanGenerator = (view, offset) => () => { view.Center = startPosition.Add (offset); view.Alpha = 1; }; // tau is a full circle in radians var tau = NMath.PI * 2; var absoluteRingSegment = tau / 4; var requiredLengthPerRing = RingRadius * 2 + 5; var totalRequiredCirlceSegment = requiredLengthPerRing * (itemCount - 1); var fannedControlRadius = NMath.Max (requiredLengthPerRing, totalRequiredCirlceSegment / absoluteRingSegment); var normalDistance = new CGVector (0, -fannedControlRadius); var scale = UIScreen.MainScreen.Scale; // Setup our item views. for (int index = 0; index < itemCount; index++) { var view = new RingView (Bounds); view.StateClosures [Selected] = selectedGenerator (view); view.StateClosures [Normal] = normalGenerator (view); nfloat angle = index / (nfloat)(itemCount - 1) * absoluteRingSegment; var fan = normalDistance.Apply (MakeRotation (angle)).RoundTo (scale); view.StateClosures [LocationFan] = locationFanGenerator (view, fan); view.StateClosures [LocationOrigin] = locationNormalGenerator (view); AddSubview (view); RingViews.Add (view); var gr = new UITapGestureRecognizer (Tap); view.AddGestureRecognizer (gr); } // Setup the initial selection state. var rv = RingViews [0]; AddSubview (rv); rv.Selected = true; selectedView = rv; UpdateViews (animated: false); }
// CGVector pointing in the same direction as self, with a length of 1.0 - or nil if the length is zero. public static CGVector?Normalize(this CGVector self) { var quadrance = self.Quadrance(); return((quadrance > 0) ? self.Divide(NMath.Sqrt(quadrance)) : (CGVector?)null); }
public static CGVector? Add (this CGVector? left, CGVector? right) { if (!left.HasValue || !right.HasValue) return null; var l = left.Value; var r = right.Value; return new CGVector (l.dx + r.dx, l.dy + r.dy); }
public static CGVector Divide(this CGVector left, nfloat right) { return(new CGVector(left.dx / right, left.dy / right)); }
UISpringTimingParameters GetSpringTimingParameters(CGVector initialVelocity) => new UISpringTimingParameters(4.5f, 900f, 90f, initialVelocity);
public void AttemptMissileLaunch(double currentTime) { double timeSinceLastFired = currentTime - timeLastFiredMissile; if (timeSinceLastFired > firingInterval) { timeLastFiredMissile = currentTime; // avoid duplicating costly math ops float shipDirection = ShipOrientation; float cos = (float) Math.Cos (shipDirection); float sin = (float) Math.Sin (shipDirection); var position = new PointF (Position.X + missileLaunchDistance * cos, Position.Y + missileLaunchDistance * sin); SKNode missile = new MissileNode (this, position); Scene.AddChild (missile); missile.PhysicsBody.Velocity = PhysicsBody.Velocity; var vector = new CGVector (missileLaunchImpulse * cos, missileLaunchImpulse * sin); missile.PhysicsBody.ApplyImpulse (vector); } }
//public static void SetCenter (this CGRect rect) //{ // //origin = center - CGVector (dx: width, dy: height) / 2 //} public static CGPoint Add(this CGPoint left, CGVector right) { return(new CGPoint(left.X + right.dx, left.Y + right.dy)); }
public static CGPoint Sub (this CGPoint left, CGVector right) { return new CGPoint (left.X - right.dx, left.Y - right.dy); }
public static CGPoint Sub(this CGPoint left, CGVector right) { return(new CGPoint(left.X - right.dx, left.Y - right.dy)); }
public CGVector GetAzimuthUnitVector () { var unitVector = new CGVector (1, 1); return unitVector.Apply (MakeRotation (Azimuth.Value)); }
void LayoutIndicatorForAzimuthAngle (nfloat azimuthAngle, CGVector azimuthUnitVector, nfloat altitudeAngle, CALayer targetLineLayer, CALayer targetDotLayer) { var reticleBounds = reticleLayer.Bounds; var centeringTransform = CGAffineTransform.MakeTranslation (reticleBounds.Width / 2f, reticleBounds.Height / 2f); var rotationTransform = CGAffineTransform.MakeRotation (azimuthAngle); // Draw the indicator opposite the azimuth by rotating pi radians, for easy visualization. rotationTransform = CGAffineTransform.Rotate (rotationTransform, NMath.PI); var altitudeRadius = (1f - altitudeAngle / NMath.PI / 2f) * radius; var lineTransform = CGAffineTransform.MakeScale (altitudeRadius, 1); lineTransform = CGAffineTransform.Multiply (lineTransform, rotationTransform); lineTransform = CGAffineTransform.Multiply (lineTransform, centeringTransform); targetLineLayer.AffineTransform = lineTransform; var dotTransform = CGAffineTransform.MakeTranslation (-azimuthUnitVector.dx * altitudeRadius, -azimuthUnitVector.dy * altitudeRadius); dotTransform = CGAffineTransform.Multiply (dotTransform, centeringTransform); targetDotLayer.AffineTransform = dotTransform; }