예제 #1
0
 public void OnCollision(Entity otherEntity, ComponentCollider otherCollider, ComponentCollider myCollider)
 {
     foreach (var c in componentList)
     {
         c.OnCollision(otherEntity, otherCollider);
     }
 }
예제 #2
0
        /// <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;
                }
            }
        }
예제 #4
0
        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);
        }
예제 #5
0
        /// <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();
                }
            }
        }