public static void DetectCollision(FireballObject fireball) { List <IGameObject> gameObjects = new List <IGameObject>(Game1.Instance.currentState.Level.GetObjects()); gameObjects.AddRange(Game1.Instance.currentState.Level.BigFloorRectangles); List <IEnemy> enemies = new List <IEnemy>(Game1.Instance.currentState.Level.GetEnemies()); Rectangle fireballRectangle = fireball.GetHitBox(); foreach (IGameObject collidedObject in gameObjects) { Rectangle collidedObjectRectangle = collidedObject.GetHitBox(); if (fireballRectangle.Intersects(collidedObjectRectangle)) { if (collidedObject is IBlock) { FireballBlockCollisionResponder.FireballCollideWithBlock(fireball, collidedObject); } else if (collidedObject is IPipe) { FireballPipeCollisionResponder.FireballCollideWithPipe(fireball, (IPipe)collidedObject, Game1.Instance.currentState.Level); } } } foreach (IEnemy enemy in enemies) { Rectangle enemyRectangle = enemy.GetHitBox(); if (fireballRectangle.Intersects(enemyRectangle)) { Game1.Instance.currentState.Level.AddObject(new FireballExpolsion((int)fireball.Position.X, (int)fireball.Position.Y)); FireballEnemyCollisionResponder.FireballCollideWithEnemy(fireball, enemy); } } }
public static void FireballCollideWithBlock(FireballObject fireball, IGameObject block) { Level level = Game1.Instance.currentState.Level; Rectangle fireballRectangle = fireball.GetHitBox(); Rectangle blockRectangle = block.GetHitBox(); IBlock castBlock = (IBlock)block; ICollision collisionSide = CollisionSideDetector.DetectCollisionSide(fireballRectangle, blockRectangle); if (castBlock.State is HiddenItemBlockState) { return; } if (collisionSide is TopCollision) { fireball.Position = new Vector2(fireball.Position.X, fireball.Position.Y - collisionSide.CollisionIntersection.Height); fireball.BounceOffGround(); } else if (collisionSide is RightCollision) { level.AddObject(new FireballExpolsion((int)fireball.Position.X, (int)fireball.Position.Y)); fireball.Explode(); } else if (collisionSide is LeftCollision) { level.AddObject(new FireballExpolsion((int)fireball.Position.X, (int)fireball.Position.Y)); fireball.Explode(); } else if (collisionSide is BottomCollision) { level.AddObject(new FireballExpolsion((int)fireball.Position.X, (int)fireball.Position.Y)); fireball.PhysicsObject.dy = 10.0F; } }
public static void FireballCollideWithPipe(FireballObject fireball, IPipe pipe, Level level) { Rectangle fireballRectangle = fireball.GetHitBox(); Rectangle pipeRectangle = pipe.GetHitBox(); ICollision collisionSide = CollisionSideDetector.DetectCollisionSide(fireballRectangle, pipeRectangle); if (collisionSide is TopCollision) { fireball.BounceOffGround(); } else { level.AddObject(new FireballExpolsion((int)fireball.Position.X, (int)fireball.Position.Y)); fireball.Explode(); } }