예제 #1
0
 public void RemoveCollisionAction(int entityId)
 {
     if (CollisionActions.ContainsKey(new Tuple <string, object>("id", entityId)))
     {
         CollisionActions.Remove(new Tuple <string, object>("id", entityId));
     }
 }
예제 #2
0
 public void RemoveCollisionAction(string entityName)
 {
     if (CollisionActions.ContainsKey(new Tuple <string, object>("name", entityName)))
     {
         CollisionActions.Remove(new Tuple <string, object>("name", entityName));
     }
 }
예제 #3
0
 //- Removal methods
 public void RemoveCollisionAction(Type entityType)
 {
     if (CollisionActions.ContainsKey(new Tuple <string, object>("type", entityType)))
     {
         CollisionActions.Remove(new Tuple <string, object>("type", entityType));
     }
 }
예제 #4
0
 public bool AddCollisionAction(int entityId, Tuple <ColisionResponce, string[]> responce)
 {
     if (!CollisionActions.ContainsKey(new Tuple <string, object>("id", entityId)))
     {
         CollisionActions[new Tuple <string, object>("id", entityId)] = responce;
         return(true);
     }
     else
     {
         return(false);
     }
 }
예제 #5
0
        public bool RemoveCollisionActionOrFail(int entityId)
        {
            if (CollisionActions.ContainsKey(new Tuple <string, object>("id", entityId)))
            {
                CollisionActions.Remove(new Tuple <string, object>("id", entityId));

                return(true);
            }
            else
            {
                return(false);
            }
        }
예제 #6
0
        private void TriggerCollisionEvent(Entity collideEntity, BoxSide side, int collideIndex)
        {
            var thisColAction = CollisionActions.FirstOrDefault(c =>
                                                                (c.Side == side || c.Side == BoxSide.All) && c.TargetTag == collideEntity.Tag);

            thisColAction?.Action.Invoke(thisColAction.ApplyActionOnCollider ? collideEntity : Entity);

            CollisionEvent?.Invoke(new CollisionData(Entity, collideEntity, side, collideIndex));

            var collideComp      = collideEntity.GetCurrentState().GetComponent <PhysicsComponent>();
            var collideColAction = collideComp?.CollisionActions.FirstOrDefault(c =>
                                                                                (c.Side == side.Inversed() || c.Side == BoxSide.All) && c.TargetTag == Entity.Tag);

            collideColAction?.Action.Invoke(collideColAction.ApplyActionOnCollider ? Entity : collideEntity);

            collideComp?.CollisionEvent?.Invoke(new CollisionData(collideEntity, Entity, side.Inversed(),
                                                                  collideIndex));
        }
        private void PushSourceAwayFromTarget(GameTime gameTime, Entity sourceEntity, Entity targetEntity)
        {
            CollisionComponent sourceCollisionComponent = ComponentManager.Instance.GetComponentOfEntity <CollisionComponent>(sourceEntity);
            CollisionComponent targetCollisionComponent = ComponentManager.Instance.GetComponentOfEntity <CollisionComponent>(targetEntity);
            GravityComponent   sourceGravityComponent   = ComponentManager.Instance.GetComponentOfEntity <GravityComponent>(sourceEntity);
            TransformComponent sourceTransformComponent = ComponentManager.Instance.GetComponentOfEntity <TransformComponent>(sourceEntity);

            if (sourceCollisionComponent.BoundingVolume.Center.X < targetCollisionComponent.BoundingVolume.Center.X)
            {
                CollisionActions.AccelerateColliderRightwards(gameTime, sourceEntity);
            }
            else
            {
                CollisionActions.AccelerateColliderLeftwards(gameTime, sourceEntity);
            }
            if (sourceCollisionComponent.BoundingVolume.Center.Z < targetCollisionComponent.BoundingVolume.Center.Z)
            {
                CollisionActions.AccelerateColliderBackwards(gameTime, sourceEntity);
            }
            else
            {
                CollisionActions.AccelerateColliderForwards(gameTime, sourceEntity);
            }
        }
        private void CheckSurfaceOfBlock(GameTime gameTime, Entity player, Entity block)
        {
            CollisionComponent playerCollisionComponent = ComponentManager.Instance.GetComponentOfEntity <CollisionComponent>(player);
            CollisionComponent blockCollisionComponent  = ComponentManager.Instance.GetComponentOfEntity <CollisionComponent>(block);

            var playerBounding = playerCollisionComponent.BoundingVolume.BoundingBox;
            var boxBounding    = blockCollisionComponent.BoundingVolume.BoundingBox;
            var diff           = boxBounding.Max.Y - (playerBounding.Min.Y);

            if (diff < 5 && diff > 0)
            {
                var gravityComponent = ComponentManager.Instance.ConcurrentGetComponentOfEntity <GravityComponent>(player);
                if (!gravityComponent.HasJumped)
                {
                    CollisionActions.RunParticleSystem(player);
                }
                CollisionActions.HandleCollisionFromAbove(gameTime, player, diff);
            }
            else
            {
                PushSourceAwayFromTarget(gameTime, player, block);
                CollisionActions.HandleCollisionFromBelow(player);
            }
        }