public void IFoundTheRegion() { var configuration = new RegionManagerConfiguration() { Columns = 3, Rows = 3, TotalSize = new Size(120, 120) }; var blocks = new List <Block> { new BasicBlock(null, new Size(10, 10)) { Position = new Vector2(15, 15) }, new BasicBlock(null, new Size(10, 10)) { Position = new Vector2(35, 15) } }; RegionManager regionManager = new RegionManager(configuration, blocks); var blocksNear = regionManager.GetBlocksByRegion(new Vector2(15, 5)); List <IBlock> found = new List <IBlock>(blocksNear); Assert.AreEqual(found.Count, 2); }
public IBlock Collides(IBall ball) { //Si a ballCenter le sumo la velocidad tengo un paso posterior y puedo recalcular la velocidad //de la bola para que no se pase de frenada Vector2 normalizedBallSpeed = new Vector2(ball.Speed.X, ball.Speed.Y); normalizedBallSpeed.Normalize(); var speedLength = ball.Speed.Length(); _nextBallSpeed = ball.Speed; var blocks = _regionManager.GetBlocksByRegion(ball.Position); if (blocks != null) { foreach (IBlock block in blocks) { //Tengo que mirar las siguientes posiciones teoricas de la bola (vector normalizado) a ver si colisiona //si lo hace, cambio velocidad para que en el siguiente fotograma sí colisione "limpiamente" //esto es, manteniendole la velocidad de salida real var collision = _blockCollisionDetector.Collides(ball.Position, block); if (collision.Collides) { _actionsOnCollision[collision.Type](ball, block); ball.Speed = _nextBallSpeed; return(block); } Vector2 nextPoint = new Vector2(ball.Position.X + normalizedBallSpeed.X, ball.Position.Y + normalizedBallSpeed.Y); //Igual tengo que mirar primero si en mi posicion actual colisiono, y si no calculo //asi me aseguro, ya que si colisiono en los siguientes puntos, lo dejo listo para que aqui salte while (nextPoint.Length() < speedLength) { //Miro si colisiona y si no, incremento el normalizado collision = _blockCollisionDetector.Collides(nextPoint, block); if (collision.Collides) { //Segun el tipo actualizo la velocidad _actionsOnCollision[collision.Type](ball, block); ball.Position = nextPoint; ball.Speed = Vector2.Zero; return(null); } nextPoint = new Vector2(nextPoint.X + normalizedBallSpeed.X, nextPoint.Y + normalizedBallSpeed.Y); } } } return(null); }