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; }
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; } }
public Pair(CollisionComponent collision, MovementComponent movement) { Collision = collision; Movement = movement; }
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); }