/// <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); }
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); } }