Пример #1
0
        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);
        }
Пример #2
0
        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);
        }