public void OnCollision(Entity otherEntity, ComponentCollider otherCollider, ComponentCollider myCollider) { foreach (var c in componentList) { c.OnCollision(otherEntity, otherCollider); } }
/// <summary> /// Returns a list of entities that are rigid colliders that the AI has to avoid /// </summary> /// <param name="pEntities">Lst of scene entites from the scene</param> /// <returns></returns> Entity[] CollidableEntities(Entity[] pEntities) { List <Entity> entities = new List <Entity>(); for (int i = 0; i < pEntities.Length; i++) { if ((pEntities[i].Mask & ComponentTypes.COMPONENT_COLLIDER) == ComponentTypes.COMPONENT_COLLIDER) { // This gets access to the collision component to check if it is rigid or a trigger // This is so trigger items such as coins arent included in the path finding for avoidable entities IComponent collisionComponent = pEntities[i].Components.Find(delegate(IComponent component) { return(component.ComponentType == ComponentTypes.COMPONENT_COLLIDER); }); ComponentCollider triggerCheck = (ComponentCollider)collisionComponent; if (!triggerCheck.isCollidable) { continue; } // If it reaches this point then the entity is a rigid collider that is to be avoided by the AI entities.Add(pEntities[i]); } } return(entities.ToArray()); }
private void DoCollisions(Entity a, Entity b) { ComponentCollider colliderA = a.GetComponent <ComponentCollider>(); ComponentCollider colliderB = b.GetComponent <ComponentCollider>(); bool isTriggerCollision = colliderA.isTriggerCollider | colliderB.isTriggerCollider; float depentration; Vector3 normal; if (colliderA.CheckCollision(colliderB, out depentration, out normal)) { if (isTriggerCollision) { if (!colliderA.inCollision) { a.OnTriggerEnter(b); colliderA.inCollision = true; } if (!colliderB.inCollision) { b.OnTriggerEnter(a); colliderB.inCollision = true; } } else { // solve the collision colliderA.transform.position += normal * depentration; } } else { // there is no collision if (isTriggerCollision) { colliderA.inCollision = false; colliderB.inCollision = false; } } }
public bool CheckCollisionBetweenTwoEntity(Entity firstEntity, ComponentCollider firstCollider, Entity secondEntity, ComponentCollider secondCollider) { if (firstCollider.Collider == ColliderType.Cube && secondCollider.Collider == ColliderType.Cube) { return(false); } else if (firstCollider.Collider == ColliderType.Sphere && secondCollider.Collider == ColliderType.Cube) { return(SphereToCubeCollision(firstEntity, (ComponentColliderSphere)firstCollider, secondEntity, (ComponentColliderCube)secondCollider)); } else if (firstCollider.Collider == ColliderType.Cube && secondCollider.Collider == ColliderType.Sphere) { return(SphereToCubeCollision(secondEntity, (ComponentColliderSphere)secondCollider, firstEntity, (ComponentColliderCube)firstCollider)); } else if (firstCollider.Collider == ColliderType.Sphere && secondCollider.Collider == ColliderType.Sphere) { return(SphereToSphereCollision(firstEntity, (ComponentColliderSphere)firstCollider, secondEntity, (ComponentColliderSphere)secondCollider)); } return(false); }
/// <summary> /// Method to manage all of the player inputs and to act on them /// </summary> /// <param name="dt">delta time</param> private void ManageMovement(float dt) { // Checks if the player want to exit the game and takes them to the main menu if (GamePad.GetState(1).Buttons.Back == ButtonState.Pressed || Keyboard.GetState().IsKeyDown(Key.Escape)) { sceneManager.ChangeScene(0); return; } float Mspeed = 6.0f, Rspeed = 4.0f; // Handles the players movement forwards if (Keyboard.GetState().IsKeyDown(Key.Up) || Keyboard.GetState().IsKeyDown(Key.W)) { sceneManager.camera.Move(new Vector3(0.0f, 0.0f, 1.0f), Mspeed * dt); } // Handles the players movement backwards if (Keyboard.GetState().IsKeyDown(Key.Down) || Keyboard.GetState().IsKeyDown(Key.S)) { sceneManager.camera.Move(new Vector3(0.0f, 0.0f, -1.0f), Mspeed * dt); } // Handles the players movement left if (Keyboard.GetState().IsKeyDown(Key.Left) || Keyboard.GetState().IsKeyDown(Key.A)) { sceneManager.camera.Rotate(1.0f, 0.0f, 0.0f, Rspeed * dt); } // Handles the players movement right if (Keyboard.GetState().IsKeyDown(Key.Right) || Keyboard.GetState().IsKeyDown(Key.D)) { sceneManager.camera.Rotate(-1.0f, 0.0f, 0.0f, Rspeed * dt); } // Debug controls to meet ACW Specification // Powerful machines will hit this method multiple times while the key is pressed so // it may flick between debug options being true and false meaning it might not work first time if (Keyboard.GetState().IsKeyDown(Key.G)) { // Toggles if the ghost AI is enabled or not if (DebugGhosts) { DebugGhosts = false; } else { DebugGhosts = true; } } // Toggles the collsion of all the rigid collidable entities if (Keyboard.GetState().IsKeyDown(Key.C)) { if (DebugCollision) { // When re enabled the list of turned of colliders are set to true again DebugCollision = false; for (int i = 0; i < DebugCollidables.Length; i++) { ComponentCollider c = (ComponentCollider)entityManager.FindEntity(DebugCollidables[i]).FindComponent(ComponentTypes.COMPONENT_COLLIDER); c.isCollidable = true; } } else { // To keep track of which entites are effected a list of their names (all unique) are added to a list // for use the in the code above List <string> names = new List <string>(); DebugCollision = true; Entity[] entities = entityManager.FindEntityWithMask(ComponentTypes.COMPONENT_COLLIDER); for (int i = 0; i < entities.Length; i++) { ComponentCollider c = (ComponentCollider)entities[i].FindComponent(ComponentTypes.COMPONENT_COLLIDER); if (c.isCollidable == true) { names.Add(entities[i].Name); c.isCollidable = false; } } DebugCollidables = names.ToArray(); } } }