private void handleCollision(CollisionInfo colInfo, float timestep)
        {
            GameObject obj1 = colInfo.Entity1;
            GameObject obj2 = colInfo.Entity2;
            Vector2 normal = colInfo.Normal;
            float depth = colInfo.Depth;

            if (!obj1.HasComponent(ComponentType.MotionProperties)) return;
            if (!obj1.HasComponent(ComponentType.Transform2D)) return;
            if (!obj1.HasComponent(ComponentType.BoundingBox)) return;
            if (!obj2.HasComponent(ComponentType.Transform2D)) return;
            if (!obj2.HasComponent(ComponentType.BoundingBox)) return;

            MotionPropertiesComponent obj1MotionComponent =
                (MotionPropertiesComponent)obj1.GetComponent(ComponentType.MotionProperties);
            Transform2DComponent obj1TransformComponent =
                (Transform2DComponent)obj1.GetComponent(ComponentType.Transform2D);
            BoundingBoxComponent obj1BoundingBoxComponent =
                (BoundingBoxComponent)obj1.GetComponent(ComponentType.BoundingBox);
            CurrentActionComponent obj1CurActionComponent =
                (CurrentActionComponent)obj1.GetComponent(ComponentType.Action);
            Transform2DComponent obj2TransformComponent =
                (Transform2DComponent)obj2.GetComponent(ComponentType.Transform2D);
            BoundingBoxComponent obj2BoundingBoxComponent =
                (BoundingBoxComponent)obj2.GetComponent(ComponentType.BoundingBox);

            //velocity correction
            Vector2 obj2obj1_vector = obj2TransformComponent.GetTranslation() - obj1TransformComponent.GetTranslation();
            obj2obj1_vector.Normalize();

            if (Vector2.Dot(normal, obj2obj1_vector) > 0)
            {
                normal = normal * -1;
            }

            Vector2 velocityCorrection = normal * depth * (float)(1.0f / timestep);
            Vector2 positionCorrection = normal * depth;

            if (obj2.HasComponent(ComponentType.MotionProperties))
            {
                MotionPropertiesComponent obj2MotionComponent =
                    (MotionPropertiesComponent)obj2.GetComponent(ComponentType.MotionProperties);

                //obj1MotionComponent.AddVelocity(velocityCorrection);

            }
            else
            {
                obj1TransformComponent.AddTranslation(positionCorrection);

                if (positionCorrection.Y != 0)
                {
                    obj1MotionComponent.SetVelocity(new Vector2(obj1MotionComponent.GetVelocity().X, 0.0f));
                }
                else if(positionCorrection.X != 0)
                {
                    obj1MotionComponent.SetVelocity(new Vector2(0.0f, obj1MotionComponent.GetVelocity().Y));
                }
                //obj1MotionComponent.AddVelocity(velocityCorrection);

            }

            if (velocityCorrection.Y != 0.0f)
            {
                obj1MotionComponent.State = MotionState.Ground;
                if (obj1CurActionComponent != null &&
                    obj1CurActionComponent.curAction.secondaryAction != SecondaryAction.Smash &&
                    obj1CurActionComponent.curAction.secondaryAction != SecondaryAction.Shield &&
                    obj1CurActionComponent.curAction.secondaryAction != SecondaryAction.Walk &&
                    obj1CurActionComponent.curAction.secondaryAction != SecondaryAction.Throw &&
                    obj1CurActionComponent.curAction.secondaryAction != SecondaryAction.Grabbed &&
                    obj1CurActionComponent.curAction.secondaryAction != SecondaryAction.Grab)
                {
                    obj1CurActionComponent.curAction.primaryAction = PrimaryAction.None;
                    obj1CurActionComponent.curAction.secondaryAction = SecondaryAction.Stand;
                }
            }
            else
            {
                obj1MotionComponent.State = MotionState.Air;
            }

            //friction
            if(obj2.HasComponent(ComponentType.PhysicalProperties))
            {
                PhysicalPropertiesComponent obj2PhysicalPropertiesComponent =
                    (PhysicalPropertiesComponent)obj2.GetComponent(ComponentType.PhysicalProperties);

                Vector2 velocity = obj1MotionComponent.GetVelocity();
                float velocityX = velocity.X / Math.Abs(velocity.X);
                if (float.IsNaN(velocityX)) velocityX = 0;
                float frictionCoefficient = obj2PhysicalPropertiesComponent.Friction * velocityX * -1.0f;

                if (velocityX != 0)
                {
                    float velocityXBuffer = obj1MotionComponent.GetVelocity().X;
                    obj1MotionComponent.AddVelocity(new Vector2(frictionCoefficient * timestep, 0.0f));

                    if (velocityXBuffer * obj1MotionComponent.GetVelocity().X < 0)
                    {
                        obj1MotionComponent.SetVelocity(
                            new Vector2(0.0f, obj1MotionComponent.GetVelocity().Y));
                    }
                }
            }
        }
 protected void triggerActionCollision(CollisionInfo colInfo, float timestep)
 {
     ActionCollision(colInfo, timestep);
 }
        protected void triggerCollisionEvent(CollisionInfo colInfo, float timestep)
        {
            GameObject obj1 = colInfo.Entity1;
            GameObject obj2 = colInfo.Entity2;

            if (obj1.HasComponent(ComponentType.IsPhysical) && obj2.HasComponent(ComponentType.IsPhysical))
            {
                this.triggerPhysicalCollision(colInfo, timestep);
            }

            if (obj1.HasComponent(ComponentType.IsAction) && obj2.HasComponent(ComponentType.IsCharacter))
            {
                this.triggerActionCollision(colInfo, timestep);
            }
        }
 protected void triggerPhysicalCollision(CollisionInfo colInfo, float timestep)
 {
     PhysicalCollision(colInfo, timestep);
 }
        private void actionHitHandler(CollisionInfo colInfo, float timestep)
        {
            GameObject obj1 = colInfo.Entity1;
            GameObject obj2 = colInfo.Entity2;
            GameObject obj1Parent = obj1.GetParent();

            if (!obj1.HasComponent(ComponentType.IsAction)) return;
            if (!obj2.HasComponent(ComponentType.IsCharacter)) return;
            if (!obj2.HasComponent(ComponentType.Health)) return;
            if (!obj2.HasComponent(ComponentType.MotionProperties)) return;

            IsActionComponent obj1ActionComponent = (IsActionComponent)obj1.GetComponent(ComponentType.IsAction);
            LifetimeComponent obj1LifetimeComponent = (LifetimeComponent)obj1.GetComponent(ComponentType.Lifetime);
            HealthComponent obj2HealthComponent = (HealthComponent)obj2.GetComponent(ComponentType.Health);
            MotionPropertiesComponent obj2MotionComponent = (MotionPropertiesComponent)obj2.GetComponent(ComponentType.MotionProperties);
            ActionInfoProjectile actionInfo = (ActionInfoProjectile)obj1ActionComponent.ActionInfo;

            obj2HealthComponent.AddDmg(actionInfo.OnHitDamage);
            Vector2 forceFinal = actionInfo.OnHitForce * obj2HealthComponent.getCurrDmg() / obj2MotionComponent.Mass;
            obj2MotionComponent.AddVelocity(forceFinal);
            obj1LifetimeComponent.Lifetime = 0;

            if (obj1Parent != null)
            {
                CurrentActionComponent obj1ParentCurAction =
                    (CurrentActionComponent)obj1Parent.GetComponent(ComponentType.Action);
            }
        }