public void Update(GameTime gameTime) { SecondsBeforeExplosion -= gameTime.ElapsedGameTime.TotalSeconds; if (SecondsBeforeExplosion <= 0) { Owner.Remove(this); SimpleLinearExplosion ExplosionUp = new SimpleLinearExplosion(Owner, CollisionBox.Position, new Vector2(0f, -1f)); SimpleLinearExplosion ExplosionDown = new SimpleLinearExplosion(Owner, CollisionBox.Position, new Vector2(0f, 1f)); SimpleLinearExplosion ExplosionLeft = new SimpleLinearExplosion(Owner, CollisionBox.Position, new Vector2(-1f, 0f)); SimpleLinearExplosion ExplosionRight = new SimpleLinearExplosion(Owner, CollisionBox.Position, new Vector2(1f, 0f)); Owner.Add(ExplosionUp); Owner.Add(ExplosionDown); Owner.Add(ExplosionLeft); Owner.Add(ExplosionRight); } }
public void DropBomb() { Owner.Add(new Bomb(Owner, Position)); }
private void OnCollision(WorldObject Other, PolygonCollisionResult FinalCollisionResult, Polygon FinalBombPolygon, Polygon FinalWorldPolygon) { float DirectionAngle = (float)Math.Atan2(Speed.Y, Speed.X); float WallMinAngle = DirectionAngle - MathHelper.PiOver4; float WallMaxAngle = DirectionAngle + MathHelper.PiOver4; Vector2 WallAxis = new Vector2(-FinalCollisionResult.Axis.Y, FinalCollisionResult.Axis.X); double FinalCollisionResultAngle = Math.Atan2(WallAxis.X, WallAxis.Y); Vector2 MovementCorection = FinalCollisionResult.Axis * FinalCollisionResult.Distance; Vector2 FinalMovement = Speed + MovementCorection; //Ground detection if (FinalCollisionResultAngle >= WallMinAngle && FinalCollisionResultAngle <= WallMaxAngle) { Speed.X = 0; Speed.Y = 0; Move(FinalMovement); } //Slope else { if (FinalWorldPolygon.PolygonCollisionPerTriangle(ForwardLeftVector.X + FinalMovement.X, ForwardLeftVector.Y + FinalMovement.Y)) { Vector2 PerpendicularAxis = BackLeftVector - ForwardLeftVector; PerpendicularAxis = new Vector2(-PerpendicularAxis.Y, PerpendicularAxis.X); PerpendicularAxis.Normalize(); Vector2 CollisionLineAxis; Vector2 LeftCollisionPoint = Polygon.GetCollisionPointFromLine(BackLeftVector, ForwardLeftVector, Speed, FinalWorldPolygon, out CollisionLineAxis); Move(LeftCollisionPoint - ForwardLeftVector); //Collision on the left, the collision axis should divert to the right if (Vector2.Dot(PerpendicularAxis, CollisionLineAxis) < 0) { double WallAngle = Math.Atan2(CollisionLineAxis.Y, CollisionLineAxis.X); Vector2 WallPerpendicularAxis = new Vector2(-CollisionLineAxis.Y, CollisionLineAxis.X); WallPerpendicularAxis.Normalize(); double WallPerpendicularAngle = Math.Atan2(WallPerpendicularAxis.Y, WallPerpendicularAxis.X); Vector2 NewExplosionForwardLeftVector = ForwardLeftVector; Vector2 NewExplosionForwardRightVector = NewExplosionForwardLeftVector + new Vector2((float)Math.Cos(WallPerpendicularAngle) * Size, (float)Math.Sin(WallPerpendicularAngle) * Size); SimpleLinearExplosion FollowingExplosion = new SimpleLinearExplosion(Owner, NewExplosionForwardLeftVector + (NewExplosionForwardRightVector - NewExplosionForwardLeftVector) / 2, new Vector2((float)Math.Cos(WallAngle) * 3, (float)Math.Sin(WallAngle) * 3)); Owner.Add(FollowingExplosion); } } else if (FinalWorldPolygon.PolygonCollisionPerTriangle(ForwardRightVector.X + FinalMovement.X, ForwardRightVector.Y + FinalMovement.Y)) { Vector2 PerpendicularAxis = BackRightVector - ForwardRightVector; PerpendicularAxis = new Vector2(-PerpendicularAxis.Y, PerpendicularAxis.X); PerpendicularAxis.Normalize(); Vector2 CollisionLineAxis; Vector2 RightCollisionPoint = Polygon.GetCollisionPointFromLine(BackRightVector, ForwardRightVector, Speed, FinalWorldPolygon, out CollisionLineAxis); Move(RightCollisionPoint - ForwardRightVector); //Collision on the right, the collision axis should divert to the left if (Vector2.Dot(PerpendicularAxis, CollisionLineAxis) < 0) { } } else { //Will happen if the collision is on a corner, consider it as a wall. } } }