Esempio n. 1
0
        public virtual void DidBeginContact(SCNPhysicsWorld world, SCNPhysicsContact contact)
        {
            if (CurrentGameState == GameState.InGame)
            {
                // Player to banana, large banana, or coconut
                if (contact.NodeA == GameLevel.PlayerCharacter.CollideSphere)
                {
                    PlayerCollideWithContact(contact.NodeB, contact.ContactPoint);
                    return;
                }
                else if (contact.NodeB == GameLevel.PlayerCharacter.CollideSphere)
                {
                    PlayerCollideWithContact(contact.NodeA, contact.ContactPoint);
                    return;
                }

                // Coconut to anything but the player.
                if ((contact.NodeB.CategoryBitMask == GameCollisionCategory.Coconut))
                {
                    HandleCollideForCoconut((Coconut)contact.NodeB);
                }
                else if ((contact.NodeA.CategoryBitMask == GameCollisionCategory.Coconut))
                {
                    HandleCollideForCoconut((Coconut)contact.NodeA);
                }
            }
        }
            public override void DidBeginContact(SCNPhysicsWorld world, SCNPhysicsContact contact)
            {
                var     nodeA  = contact.NodeA;
                var     nodeB  = contact.NodeB;
                SCNNode target = null;

                if (nodeA.PhysicsBody.CategoryBitMask == (int)BitMaskCategory.Pokemon)
                {
                    target = nodeA;
                }
                else if (nodeB.PhysicsBody.CategoryBitMask == (int)BitMaskCategory.Pokemon)
                {
                    target = nodeB;
                }

                if (target != null && !animatedNodes.Contains(target))
                {
                    var targetScale = target.Scale;

                    animatedNodes.Add(target);

                    target.RunAction(SCNAction.Sequence(new SCNAction[] {
                        SCNAction.ScaleTo(0, 1.0f),
                        SCNAction.ScaleTo(targetScale.X, 2.0f),
                    }), () => {
                        animatedNodes.Remove(target);
                    });
                }
            }
Esempio n. 3
0
        public void DidBeginContactAll(SCNPhysicsContact contact)
        {
            [email protected]();

            foreach (var projectile in this.projectiles)
            {
                projectile.DidBeginContact(contact);
            }

            [email protected]();
        }
Esempio n. 4
0
        public virtual void DidUpdateContact(SCNPhysicsWorld world, SCNPhysicsContact contact)
        {
            if (contact.NodeA?.PhysicsBody.CategoryBitMask == (nuint)(int)Bitmask.Collision)
            {
                CharacterNodeHitWallWithContact(contact.NodeB, contact);
            }

            if (contact.NodeB?.PhysicsBody.CategoryBitMask == (nuint)(int)Bitmask.Collision)
            {
                CharacterNodeHitWallWithContact(contact.NodeA, contact);
            }
        }
Esempio n. 5
0
        public virtual void DidBeginContact(SCNPhysicsWorld world, SCNPhysicsContact contact)
        {
            if (contact.NodeA.PhysicsBody.CategoryBitMask == (nuint)(int)Bitmask.Collision)
            {
                CharacterNodeHitWallWithContact(contact.NodeB, contact);
            }

            if (contact.NodeB.PhysicsBody.CategoryBitMask == (nuint)(int)Bitmask.Collision)
            {
                CharacterNodeHitWallWithContact(contact.NodeA, contact);
            }

            if (contact.NodeA.PhysicsBody.CategoryBitMask == (nuint)(int)Bitmask.Collectable)
            {
                CollectPearl(contact.NodeA);
            }

            if (contact.NodeB.PhysicsBody.CategoryBitMask == (nuint)(int)Bitmask.Collectable)
            {
                CollectPearl(contact.NodeB);
            }

            if (contact.NodeA.PhysicsBody.CategoryBitMask == (nuint)(int)Bitmask.SuperCollectable)
            {
                CollectFlower(contact.NodeA);
            }

            if (contact.NodeB.PhysicsBody.CategoryBitMask == (nuint)(int)Bitmask.SuperCollectable)
            {
                CollectFlower(contact.NodeB);
            }

            if (contact.NodeA.PhysicsBody.CategoryBitMask == (nuint)(int)Bitmask.Enemy)
            {
                WasHit();
            }

            if (contact.NodeB.PhysicsBody.CategoryBitMask == (nuint)(int)Bitmask.Enemy)
            {
                WasHit();
            }
        }
Esempio n. 6
0
        void CharacterNodeHitWallWithContact(SCNNode capsule, SCNPhysicsContact contact)
        {
            if (capsule.ParentNode != Character.Node)
            {
                return;
            }

            if (maxPenetrationDistance > contact.PenetrationDistance)
            {
                return;
            }

            maxPenetrationDistance = contact.PenetrationDistance;

            var        charPosition = Character.Node.Position;
            SCNVector3 n            = contact.ContactNormal;

            SCNVector3.Multiply(ref n, (float)contact.PenetrationDistance, out n);
            n.Y = 0;

            SCNVector3.Add(ref charPosition, ref n, out replacementPosition);
            positionNeedsAdjustment = true;
        }
Esempio n. 7
0
        private Tuple <SCNVector3, SCNVector3> HandleSlidingAtContact(SCNPhysicsContact closestContact, SCNVector3 start, SCNVector3 velocity)
        {
            var originalDistance = velocity.Length;

            var colliderPositionAtContact = start + (float)closestContact.SweepTestFraction * velocity;

            // Compute the sliding plane.
            var slidePlaneNormal = new SCNVector3(closestContact.ContactNormal);
            var slidePlaneOrigin = new SCNVector3(closestContact.ContactPoint);
            var centerOffset     = slidePlaneOrigin - colliderPositionAtContact;

            // Compute destination relative to the point of contact.
            var destinationPoint = slidePlaneOrigin + velocity;

            // We now project the destination point onto the sliding plane.
            var distPlane = SCNVector3.Dot(slidePlaneOrigin, slidePlaneNormal);

            // Project on plane.
            var t = Utils.PlaneIntersect(slidePlaneNormal, distPlane, destinationPoint, slidePlaneNormal);

            var normalizedVelocity = velocity * (1f / originalDistance);
            var angle = SCNVector3.Dot(slidePlaneNormal, normalizedVelocity);

            var frictionCoeff = 0.3f;

            if (Math.Abs(angle) < 0.9f)
            {
                t            += (float)10E-3;
                frictionCoeff = 1.0f;
            }

            var newDestinationPoint = (destinationPoint + t * slidePlaneNormal) - centerOffset;
            // Advance start position to nearest point without collision.
            var computedVelocity = frictionCoeff * (float)(1f - closestContact.SweepTestFraction) * originalDistance * SCNVector3.Normalize(newDestinationPoint - start);

            return(new Tuple <SCNVector3, SCNVector3>(computedVelocity, colliderPositionAtContact));
        }
		void CharacterNodeHitWallWithContact (SCNNode capsule, SCNPhysicsContact contact)
		{
			if (capsule.ParentNode != Character.Node)
				return;

			if (maxPenetrationDistance > contact.PenetrationDistance)
				return;

			maxPenetrationDistance = contact.PenetrationDistance;

			var charPosition = Character.Node.Position;
			SCNVector3 n = contact.ContactNormal;
			SCNVector3.Multiply (ref n, (float)contact.PenetrationDistance, out n);
			n.Y = 0;

			SCNVector3.Add (ref charPosition, ref n, out replacementPosition);
			positionNeedsAdjustment = true;
		}
		public virtual void DidUpdateContact (SCNPhysicsWorld world, SCNPhysicsContact contact)
		{
			if (contact.NodeA?.PhysicsBody.CategoryBitMask == (nuint)(int)Bitmask.Collision)
				CharacterNodeHitWallWithContact (contact.NodeB, contact);

			if (contact.NodeB?.PhysicsBody.CategoryBitMask == (nuint)(int)Bitmask.Collision)
				CharacterNodeHitWallWithContact (contact.NodeA, contact);
		}
		public virtual void DidBeginContact (SCNPhysicsWorld world, SCNPhysicsContact contact)
		{
			if (contact.NodeA.PhysicsBody.CategoryBitMask == (nuint)(int)Bitmask.Collision)
				CharacterNodeHitWallWithContact (contact.NodeB, contact);

			if (contact.NodeB.PhysicsBody.CategoryBitMask == (nuint)(int)Bitmask.Collision)
				CharacterNodeHitWallWithContact (contact.NodeA, contact);

			if (contact.NodeA.PhysicsBody.CategoryBitMask == (nuint)(int)Bitmask.Collectable)
				CollectPearl (contact.NodeA);

			if (contact.NodeB.PhysicsBody.CategoryBitMask == (nuint)(int)Bitmask.Collectable)
				CollectPearl (contact.NodeB);

			if (contact.NodeA.PhysicsBody.CategoryBitMask == (nuint)(int)Bitmask.SuperCollectable)
				CollectFlower (contact.NodeA);

			if (contact.NodeB.PhysicsBody.CategoryBitMask == (nuint)(int)Bitmask.SuperCollectable)
				CollectFlower (contact.NodeB);

			if (contact.NodeA.PhysicsBody.CategoryBitMask == (nuint)(int)Bitmask.Enemy)
				WasHit ();

			if (contact.NodeB.PhysicsBody.CategoryBitMask == (nuint)(int)Bitmask.Enemy)
				WasHit ();
		}
Esempio n. 11
0
 public void DidBeginContact(SCNPhysicsContact contact)
 {
 }
Esempio n. 12
0
		public void DidBeginContact (SCNPhysicsWorld world, SCNPhysicsContact contact)
		{
			SCNNode ball;

			if (contact.NodeA.PhysicsBody.Type == SCNPhysicsBodyType.Dynamic) {
				ball = contact.NodeA;
			} else {
				ball = contact.NodeB;
			}

			if (ball != null) {
				DispatchQueue.MainQueue.DispatchAsync (ball.RemoveFromParentNode);

				var plokCopy = (SCNParticleSystem)Plok.Copy ();
				plokCopy.ParticleImage = Plok.ParticleImage; // to workaround an bug in seed #1
				plokCopy.ParticleColor = (SKColor)ball.Geometry.FirstMaterial.Diffuse.Contents;
				Scene.AddParticleSystem (plokCopy, SCNMatrix4.CreateTranslation (contact.ContactPoint.X, contact.ContactPoint.Y, contact.ContactPoint.Z));

				//compute texture coordinate
				var pointA = new SCNVector3 (contact.ContactPoint.X, contact.ContactPoint.Y, contact.ContactPoint.Z + 20);
				var pointB = new SCNVector3 (contact.ContactPoint.X, contact.ContactPoint.Y, contact.ContactPoint.Z - 20);

				var hitTestOptions = new SCNHitTestOptions (NSDictionary.FromObjectAndKey (Torus, SCNHitTest.RootNodeKey));
				var results = SceneView.Scene.RootNode.HitTest (pointA, pointB, hitTestOptions);

				if (results.Length > 0) {
					var hit = results [0];
					AddPaint (hit.GetTextureCoordinatesWithMappingChannel (0), plokCopy.ParticleColor);
				}
			}
		}
Esempio n. 13
0
		public virtual void DidBeginContact (SCNPhysicsWorld world, SCNPhysicsContact contact)
		{
			if (CurrentGameState == GameState.InGame) {
				// Player to banana, large banana, or coconut
				if (contact.NodeA == GameLevel.PlayerCharacter.CollideSphere) {
					PlayerCollideWithContact (contact.NodeB, contact.ContactPoint);
					return;
				} else if (contact.NodeB == GameLevel.PlayerCharacter.CollideSphere) {
					PlayerCollideWithContact (contact.NodeA, contact.ContactPoint);
					return;
				}

				// Coconut to anything but the player.
				if ((contact.NodeB.CategoryBitMask == GameCollisionCategory.Coconut)) {
					HandleCollideForCoconut ((Coconut)contact.NodeB);
				} else if ((contact.NodeA.CategoryBitMask == GameCollisionCategory.Coconut)) {
					HandleCollideForCoconut ((Coconut)contact.NodeA);
				}
			}
		}