// updates this grid based on the motion of obj public void Update(CollidableObject obj, CollisionBox oldBox, CollisionBox newBox) { int oldMinX = (int)(oldBox.Min.X / squareSize); int oldMaxX = (int)(oldBox.Max.X / squareSize); int oldMinY = (int)(oldBox.Min.Y / squareSize); int oldMaxY = (int)(oldBox.Max.Y / squareSize); int newMinX = (int)(newBox.Min.X / squareSize); int newMaxX = (int)(newBox.Max.X / squareSize); int newMinY = (int)(newBox.Min.Y / squareSize); int newMaxY = (int)(newBox.Max.Y / squareSize); for (int x = oldMinX; x <= oldMaxX; x++) { for (int y = oldMinY; y <= oldMaxY; y++) { if (x >= 0 && y >= 0 && x < grid.GetLength(0) && y < grid.GetLength(1)) { grid[x, y].Remove(obj); } } } for (int x = newMinX; x <= newMaxX; x++) { for (int y = newMinY; y <= newMaxY; y++) { if (x >= 0 && y >= 0 && x < grid.GetLength(0) && y < grid.GetLength(1)) { grid[x, y].Add(obj); } } } }
// returns true if the collision is with a hiddenblock on its left, right, or top side public static bool HiddenBlockSpecialCase(CollidableObject objA, CollidableObject objB) { CollisionBox tempABox = new CollisionBox(objA.CollisionBox.Min - objA.Velocity, objA.CollisionBox.Max - objA.Velocity); CollisionBox tempBBox = new CollisionBox(objB.CollisionBox.Min - objB.Velocity, objB.CollisionBox.Max - objB.Velocity); if (objA is QuestionBlock && (objA as QuestionBlock).State is HiddenQuestionBlock) { return(!tempABox.TopOf(tempBBox)); } else if (objA is BrickBlock && (objA as BrickBlock).State is HiddenBrickBlock) { return(!tempABox.TopOf(tempBBox)); } else if (objB is QuestionBlock && (objB as QuestionBlock).State is HiddenQuestionBlock) { return(!tempABox.BottomOf(tempBBox)); } else if (objB is BrickBlock && (objB as BrickBlock).State is HiddenBrickBlock) { return(!tempABox.BottomOf(tempBBox)); } else { return(false); } }
public override void CollideBottom(CollidableObject obj) { if (obj is Block) { _velocity.Y = 0; } else if (obj is Fireball) { Die(); } }
// removes all instances of obj from the grid public void Remove(CollidableObject obj) { foreach (var objList in grid) { objList.Remove(obj); } }
public override void CollideTop(CollidableObject obj) { if (obj is Sanitizerball) { Die(); } }
public override void CollideTop(CollidableObject obj) { if (obj is Fireball) { Die(); } }
public override void CollideTop(CollidableObject obj) { if (obj is Block || obj is WarpPipe || obj is Cloud) { DownAction(); _velocity.Y = 0; } else if (obj is Flagpole) { Game1.SoundMap["FlagPole"].Play(); TimeWon = new TimeSpan(); OnFlagpole = true; _velocity.Y = 0.5f; Acceleration = new Vector2(0, 0); DownAction(); } else if (obj is Peach) { TimeWon = new TimeSpan(); OnFlagpole = true; Acceleration = new Vector2(0, 0); DownAction(); } else if (obj is PowerUp) { CollidePowerUp(obj as PowerUp); } if ((obj is MiniCovid || obj is CovidBoss) && !Sprite.IsMasked) { TakeToxicDamage(18); DownAction(); } }
public override void CollideTop(CollidableObject obj) { if (obj is Avatar) { Game1.HUDMap["Score"] += 500; } }
public override void CollideRight(CollidableObject obj) { if (!(obj is Avatar)) { _velocity.X *= -1; } }
// returns true if only obj1's position needs to change to revert intersection // if fails, then reverts its changes private static bool TryFixObj(CollidableObject obj1, CollidableObject obj2) { // determine whether to fix X or Y first if (Math.Abs(obj1.Velocity.X) < Math.Abs(obj1.Velocity.Y)) { if (!TryUpdateX(obj1, obj2)) { if (!TryUpdateY(obj1, obj2)) { return(TryUpdateXAndY(obj1, obj2)); } } } else { if (!TryUpdateY(obj1, obj2)) { if (!TryUpdateX(obj1, obj2)) { return(TryUpdateXAndY(obj1, obj2)); } } } return(false); }
public override void CollideBottom(CollidableObject obj) { if (!(obj is Avatar)) { _velocity.Y *= -1; } }
public override void CollideTop(CollidableObject obj) { _velocity.Y = verticalSpeed; if (obj is Sanitizerball) { TakeDamage(); } }
public override void CollideRight(CollidableObject obj) { _velocity.X = -horizontalSpeed; isFacingLeft = true; if (obj is Sanitizerball) { TakeDamage(); Game1.SoundMap["BatScreech"].Play(); } }
public override void CollideBottom(CollidableObject obj) { if (obj is Block) { _velocity.Y = -2; } else { Explode(); } }
public override void CollideTop(CollidableObject obj) { if (obj is Avatar) { if (!isFalling) { Game1.HUDMap["Lives"]++; isFalling = true; Animate = true; } } }
// returns true if only obj1's y needs to change to revert intersection // if fails, then reverts its changes private static bool TryUpdateY(CollidableObject obj1, CollidableObject obj2) { obj1.Position = new Vector2(obj1.Position.X, obj1.Position.Y - obj1.Velocity.Y); if (!obj1.CollisionBox.Intersects(obj2.CollisionBox)) { return(true); } else { obj1.Position = new Vector2(obj1.Position.X, obj1.Position.Y + obj1.Velocity.Y); return(false); } }
public override void CollideTop(CollidableObject obj) { if (obj is Avatar) { ToBeRemoved = true; Game1.SoundMap["CoinCollect"].Play(); Game1.HUDMap["Coins"]++; Game1.HUDMap["Score"] += 200; if (Game1.HUDMap["Coins"] % 10 == 0) { Game1.HUDMap["Lives"]++; } } }
// returns true if only obj1's position needs to change to revert intersection // if fails, then reverts its changes private static bool TryUpdateXAndY(CollidableObject obj1, CollidableObject obj2) { obj1.Position -= obj1.Velocity; if (!obj1.CollisionBox.Intersects(obj2.CollisionBox)) { return(true); } else { obj1.Position += obj1.Velocity; return(false); } }
public override void CollideTop(CollidableObject obj) { if (obj is Avatar) { ToBeRemoved = true; if (State is LifeMushroom) { Game1.SoundMap["LifeShroom"].Play(); } else if (State is SuperMushroom) { Game1.SoundMap["PUpShroom"].Play(); } } }
public override void CollideBottom(CollidableObject obj) { if (obj is Avatar) { var powerState = (obj as Avatar).PowerState; if (powerState is SuperState || powerState is FireState) { BreakAction(); } else { BumpAction(); } } }
public override void CollideLeft(CollidableObject obj) { leftCol = true; rightCol = false; if (obj is Fireball) { Die(); } else if (obj is Koopa) { if ((obj as Koopa).Type is GreenProjectile || (obj as Koopa).Type is RedProjectile) { Die(); } } }
public override void CollideRight(CollidableObject obj) { rightCol = true; leftCol = false; if (obj is Sanitizerball) { Die(); } else if (obj is Koopa) { if ((obj as Koopa).Type is GreenProjectile || (obj as Koopa).Type is RedProjectile) { Die(); } } }
public override void CollideRight(CollidableObject obj) { if (obj is Block || obj is Cloud) { LeftAction(); } else if (obj is WarpPipe) { bool canFit = CollisionBox.Min.Y >= (obj as WarpPipe).CollisionBox.Min.Y && CollisionBox.Max.Y <= (obj as WarpPipe).CollisionBox.Max.Y; if (HorizontalState is RunningRightAvatar && (obj as WarpPipe).Type is Side && canFit) { InitWarpRight(obj as WarpPipe); } else { LeftAction(); } } else if (obj is Flagpole) { Game1.SoundMap["FlagPole"].Play(); TimeWon = new TimeSpan(); OnFlagpole = true; _velocity.Y = 0.5f; Acceleration = new Vector2(0, 0); LeftAction(); } else if (obj is Peach) { TimeWon = new TimeSpan(); OnFlagpole = true; Acceleration = new Vector2(0, 0); LeftAction(); } else if (obj is PowerUp) { CollidePowerUp(obj as PowerUp); } else if (obj is Gate) { ReachedGate = true; } if ((obj is MiniCovid || obj is CovidBoss) && !Sprite.IsMasked) { TakeToxicDamage(18); } }
public override void CollideRight(CollidableObject obj) { if (obj is Avatar) { if (obj is Avatar) { if (!isFalling) { if (Level.Avatar.Position.Y > 0 && Level.Avatar.Position.Y <= 6) { Game1.HUDMap["Lives"]++; isFalling = true; } else if (Level.Avatar.Position.Y > 6 && Level.Avatar.Position.Y <= 32) { Game1.HUDMap["Score"] += 4000; isFalling = true; } else if (Level.Avatar.Position.Y > 32 && Level.Avatar.Position.Y <= 78) { Game1.HUDMap["Score"] += 2000; isFalling = true; } else if (Level.Avatar.Position.Y > 78 && Level.Avatar.Position.Y <= 102) { Game1.HUDMap["Score"] += 1000; isFalling = true; } else if (Level.Avatar.Position.Y > 102 && Level.Avatar.Position.Y <= 142) { Game1.HUDMap["Score"] += 400; isFalling = true; } else if (Level.Avatar.Position.Y > 142 && Level.Avatar.Position.Y <= 160) { Game1.HUDMap["Score"] += 100; isFalling = true; } Animate = true; } } } }
public override void CollideTop(CollidableObject obj) { if (obj is Avatar) { if (Type is GreenKoopa) { Type = new GreenShell(); GreenShell(); } else if (Type is RedKoopa) { Type = new RedShell(); RedShell(); } else if (Type is GreenProjectile) { GreenShell(); } else if (Type is RedProjectile) { RedShell(); } } else if (obj is Fireball) { Die(); } }
public override void CollideRight(CollidableObject obj) { if (obj is Avatar) { if (Type is GreenShell) { GreenProjectile(); rGreenCollide = true; lGreenCollide = false; } else if (Type is RedShell) { RedProjectile(); rRedCollide = true; lRedCollide = false; } } rightCol = true; leftCol = false; if (obj is Fireball) { Die(); } }
private void UpdateCollisions() { var movingObjects = new HashSet <CollidableObject>(GameObjects.Where(x => x is CollidableObject && (x as CollidableObject).Velocity.Length() > 0).Cast <CollidableObject>()); HashSet <Tuple <CollidableObject, CollidableObject> > possibleCollisions = ColliderGrid.GetPossibleCollisionPairs(movingObjects); List <Collision> actualCollisions = new List <Collision>(); foreach (var pair in possibleCollisions) { CollidableObject objA = pair.Item1; CollidableObject objB = pair.Item2; if (objA.CollisionBox.Intersects(objB.CollisionBox)) { actualCollisions.Add(new Collision(objA, objB)); } } foreach (var coll in actualCollisions) { coll.UpdatePostCollision(); } }
public override void CollideTop(CollidableObject obj) { }
public override void CollideRight(CollidableObject obj) { }
public override void CollideLeft(CollidableObject obj) { }