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); }); } }
public void DidBeginContactAll(SCNPhysicsContact contact) { [email protected](); foreach (var projectile in this.projectiles) { projectile.DidBeginContact(contact); } [email protected](); }
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(); } }
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; }
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 (); }
public void DidBeginContact(SCNPhysicsContact contact) { }
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); } } }
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); } } }