Esempio n. 1
0
 private static void ExitMovementBlink(BlinkComponent blink, MovementComponent movement)
 {
     movement.Speed = blink.MovementExitSpeed;
     if (blink.Bindings.TryGetValue(typeof(CollisionComponent), out var collisionBinding))
     {
         CollisionComponent collision = collisionBinding as CollisionComponent;
         collision.IsPhasing = false;
     }
     if (blink.Bindings.TryGetValue(typeof(DrawComponent), out var drawBinding))
     {
         DrawComponent draw = drawBinding as DrawComponent;
         if (draw.Tint == Color.Cyan)
         {
             draw.Tint = Color.White;
         }
     }
     blink.CurrentEntityState.Blinking = false;
 }
Esempio n. 2
0
        private static void SetMovementVariablesForBindings(BlinkComponent blink)
        {
            if (blink.InvulnerableOnMovementBlink)
            {
                if (blink.Bindings.TryGetValue(typeof(HealthComponent), out var healthBinding))
                {
                    HealthComponent health = healthBinding as HealthComponent;
                    //TODO make this shit invincible, use blink duration
                }
            }

            if (blink.Bindings.TryGetValue(typeof(CollisionComponent), out var collisionBinding))
            {
                CollisionComponent collision = collisionBinding as CollisionComponent;
                collision.IsPhasing = true;
            }

            if (blink.Bindings.TryGetValue(typeof(DrawComponent), out var drawBinding)) //TODO Breunig talk about Coupling
            {
                DrawComponent draw = drawBinding as DrawComponent;
                draw.Tint = Color.Cyan;
            }
        }
Esempio n. 3
0
 public Pair(CollisionComponent collision, MovementComponent movement)
 {
     Collision = collision;
     Movement  = movement;
 }
Esempio n. 4
0
        private static float SweptAABB(CollisionSystem.Pair actor, CollisionComponent target, GameTime gameTime, out int normalX, out int normalY) //TODO THIS ALGORITHM IS NOT FUNCTIONAL, TOO LAZY TO FIX IT NOW
        {
            float xEntryDistance, yEntryDistance;
            float xExitDistance, yExitDistance;

            #region calculate distances
            if (actor.Movement.Speed.Cartesian.X > 0.0f)
            {
                xEntryDistance = target.CollisionRectangle.X - (actor.Collision.CollisionRectangle.X + actor.Collision.CollisionRectangle.Width);
                xExitDistance  = (target.CollisionRectangle.X + target.CollisionRectangle.Width) - actor.Collision.CollisionRectangle.X;
            }
            else
            {
                xEntryDistance = (target.CollisionRectangle.X + target.CollisionRectangle.Width) - actor.Collision.CollisionRectangle.X;
                xExitDistance  = target.CollisionRectangle.X - (actor.Collision.CollisionRectangle.X + actor.Collision.CollisionRectangle.Width);
            }

            if (actor.Movement.Speed.Cartesian.Y > 0.0f)
            {
                yEntryDistance = target.CollisionRectangle.Y - (actor.Collision.CollisionRectangle.Y + actor.Collision.CollisionRectangle.Height);
                yExitDistance  = (target.CollisionRectangle.Y + target.CollisionRectangle.Height) - actor.Collision.CollisionRectangle.Y;
            }
            else
            {
                yEntryDistance = (target.CollisionRectangle.Y + target.CollisionRectangle.Height) - actor.Collision.CollisionRectangle.Y;
                yExitDistance  = target.CollisionRectangle.Y - (actor.Collision.CollisionRectangle.Y + actor.Collision.CollisionRectangle.Height);
            }
            #endregion

            float xEntryTime, yEntryTime;
            float xExitTime, yExitTime;

            #region calculate entry and exit times
            if (actor.Movement.Speed.Cartesian.X == 0.0f)
            {
                xEntryTime = float.NegativeInfinity;
                xExitTime  = float.PositiveInfinity;
            }
            else
            {
                xEntryTime = xEntryDistance / (actor.Movement.Speed.Cartesian.X * (float)gameTime.ElapsedGameTime.TotalSeconds);
                xExitTime  = xExitDistance / (actor.Movement.Speed.Cartesian.Y * (float)gameTime.ElapsedGameTime.TotalSeconds);
            }

            if (actor.Movement.Speed.Cartesian.Y == 0.0f)
            {
                yEntryTime = float.NegativeInfinity;
                yExitTime  = float.PositiveInfinity;
            }
            else
            {
                yEntryTime = yEntryDistance / (actor.Movement.Speed.Cartesian.Y * (float)gameTime.ElapsedGameTime.TotalSeconds);
                yExitTime  = yExitDistance / (actor.Movement.Speed.Cartesian.Y * (float)gameTime.ElapsedGameTime.TotalSeconds);
            }
            #endregion
            if (xEntryTime > 1.0f)
            {
                xEntryTime = -float.MaxValue;
            }
            if (yEntryTime > 1.0f)
            {
                yEntryTime = -float.MaxValue;
            }
            float entryTime = Math.Max(xEntryTime, yEntryTime);
            float exitTime  = Math.Min(xExitTime, yExitTime);

            #region no collision happened
            if ((entryTime > exitTime) || (xEntryTime < 0.0f && yEntryTime < 0.0f))
            {
                normalX = 0;
                normalY = 0;
                return(1.0f);
            }

            #endregion

            #region set normals
            if (xEntryTime > yEntryTime)
            {
                normalX = -1;
                normalY = 1;
            }
            else
            {
                normalX = 1;
                normalY = -1;
            }
            #endregion
            return(entryTime);
        }