예제 #1
0
 public override void invoke(CollisionEvent eventObject)
 {
     if (eventObject.TriggeringEntity == this.owner
         && eventObject.CollisionResult.triggeringBody.Solid
         && eventObject.CollisionResult.affectedBody.Solid)
     {
         // Le aplica una fuerza de impacto
         EventManager.Instance.fireEvent(ForceAppliedEvent.Create(eventObject.AffectedEntity, this.angle, this.magnitude));
     }
 }
예제 #2
0
 public override void invoke(CollisionEvent eventObject)
 {
     if (eventObject.CollisionResult.triggeringBody.Owner == this.owner)
     {
         // Si no es multihit entonces guarda la entidad a la que atacará
         // y luego realiza el ataque
         // Hace cierto daño a la entidad
         EventManager.Instance.fireEvent(DamageEvent.Create(eventObject.AffectedEntity, owner.find<PhysicalAttackComponent>().Damage, this.owner, ElementType.NONE));
     }
 }
예제 #3
0
        public override void invoke(CollisionEvent eventObject)
        {
            // se asegura que ambos cuerpos sean solidos
            if (eventObject.CollisionResult.triggeringBody.Solid && eventObject.CollisionResult.affectedBody.Solid)
            {
                // se calcula una fuerza de impacto basado en que tan profundo fue la colisión
                float force = eventObject.CollisionResult.minimumTranslationVector.Length() * 10000;
                double angle = 0;
                // Luego se verifica si es la entidad causante o afectada para determinar la direccion en la cual se aplicara la fuerza
                Vector2 direction = eventObject.CollisionResult.translationAxis;
                if (eventObject.AffectedEntity == this.owner)
                {
                    Vector2.Multiply(ref direction, -1, out direction);
                }

                angle = UtilMethods.directionToAngle(ref direction);
                EventManager.Instance.fireEvent(ForceAppliedEvent.Create(this.owner, angle, force));
            }
        }
예제 #4
0
        public override void invoke(CollisionEvent eventObject)
        {
            if (eventObject.AffectedEntity == this.owner && eventObject.CollisionResult.triggeringBody.Solid && eventObject.CollisionResult.affectedBody.Solid)
            {
                // Se calcula el angulo entre un vector recto horizontalmente y la perpendicular del eje de transicion
                // para saber si el angulo es mayor o menor a 45 grados, en caso de que sea menor determinamos que la entidad que ha colisionado
                // con esta superficie se encuentra en tierra
                Vector2 perpendicular = new Vector2();
                perpendicular.X = -eventObject.CollisionResult.translationAxis.Y;
                perpendicular.Y = eventObject.CollisionResult.translationAxis.X;

                double angle = (Math.Atan2(0, 1) - Math.Atan2(perpendicular.Y, perpendicular.X)) * (180 / Math.PI);
                if ((Math.Abs(angle) >= 125 || Math.Abs(angle) <= 55)
                    && eventObject.CollisionResult.minimumTranslationVector.Y <= 0
                    && eventObject.CollisionResult.triggeringBody.Center.Y < eventObject.CollisionResult.affectedBody.Center.Y)
                {
                    EventManager.Instance.fireEvent(SurfaceContactEvent.Create(eventObject.TriggeringEntity));
                    EventManager.Instance.fireEvent(EntityOnSurfaceEvent.Create(this.owner, eventObject.TriggeringEntity));
                    /*SurfaceComponent comp = this.owner.find<SurfaceComponent>();
                    if (comp != null) { comp.addEntityOnSurface(eventObject.TriggeringEtity); }*/
                }
            }
        }
예제 #5
0
 public void invoke(CollisionEvent eventObject)
 {
     if (!isActive)
     {
         currentEntity = eventObject.TriggeringEntity;
         isActive = true;
         isEnabled = true;
         EventManager.Instance.fireEvent(TriggerRangeEvent.Create(zone, currentEntity, true));
     }
 }
 public abstract void invoke(CollisionEvent eventObject);