Exemplo n.º 1
0
        /// <summary>
        /// Mueve la pelota hacia el punto indicado,
        /// el movimiento hacia ese punto es lineal,
        /// en base a ese movimiento tambien hace la rotacion de la pelota
        /// </summary>
        private void Mover(Vector3 movimiento, float elapsedTime)
        {
            Vector3 lastsphereposition = sphere.Position;
            Vector3 lastboxposition    = box.Position;

            moveTo(movimiento);

            ColisionInfo colisionInfo = collisionManager.GetColisiones(box.BoundingBox);

            foreach (IColisionablePelota objetoColisionado in colisionInfo.getColisiones())
            {
                objetoColisionado.ColisionasteConPelota(this);

                if (hayTiro())
                {
                    //solo rebota con el tiro, con el pase no hace nada
                    if (tiro is TiroParabolicoSimple)
                    {
                        //aca uso el movimiento real, sin tener en cuenta la colision, para saber la direccion que toma el tiro en el rebote
                        tiro = new TiroParabolicoSimple(objetoColisionado.GetDireccionDeRebote(movimiento),
                                                        objetoColisionado.GetFuerzaRebote(movimiento, tiro.getFuerza()));
                    }
                }
                else if (hayMovimiento(movimiento))
                {
                    //aca uso el movimiento real, sin tener en cuenta la colision, para saber la direccion que toma el tiro en el rebote
                    tiro = new TiroParabolicoSimple(objetoColisionado.GetDireccionDeRebote(movimiento),
                                                    objetoColisionado.GetFuerzaRebote(movimiento, 50));
                }
            }

            //arma la transformacion en base al escalado + rotacion + traslacion
            sphere.Transform = getScalingMatrix() * getRotationMatrix(movimiento, elapsedTime) *
                               Matrix.Translation(sphere.Position);
        }
Exemplo n.º 2
0
        public void updateValues(float elapsedTime)
        {
            //movimiento que se guarda cuando se llama a mover directo
            Vector3 movimiento = this.movimiento;

            //manejo de gravedad
            //if (sphere.Position.Y > gravityForce && !hayTiro())
            if (this.box.BoundingBox.PMin.Y > gravityForce && !hayTiro())
            {
                movimiento.Y -= gravityForce;
            }

            if (this.box.BoundingBox.PMin.Y < 0 && !hayTiro())
            {
                //si el boundingbox se va para abajo, entonces lo arreglo.
                movimiento.Y = -this.box.BoundingBox.PMin.Y + 0.01f;
            }
            //manejo de gravedad
            if (hayMovimiento(movimiento))
            {
                Mover(movimiento, elapsedTime);
                resetTiro();
                resetMovimiento();
                return;
            }

            if (hayTiro())
            {
                //existe un tiro en proceso
                Mover(tiro.siguienteMovimiento(elapsedTime), elapsedTime);
                return;
            }

            //si llego hasta aca no habia movimiento y no habia tiro activo, me fijo si la pelota colisiono con algo
            ColisionInfo colisionInfo = collisionManager.GetColisiones(box.BoundingBox);

            foreach (IColisionablePelota objetoColisionado in colisionInfo.getColisiones())
            {
                objetoColisionado.ColisionasteConPelota(this);
            }
        }