// se aplica la estrategia solo si el aplicador esta a una distancia // valida para disparar y no ser daniado por el proyectil public void Aplicar() { Casilla posicionDelProyectil = this.aplicador.Posicion(); int[] direccionDelProyectil = this.aplicador.Direccion(); int rangoDelProyectil = Proyectil.RANGO; try { Casilla posicionAdyacente = posicionDelProyectil.CasillaAdyacenteEnLaDireccion(direccionDelProyectil); bool puedeAplicarse = true; while (rangoDelProyectil >= 0 && puedeAplicarse) { if (!posicionAdyacente.EstaVacia()) puedeAplicarse = false; rangoDelProyectil--; posicionAdyacente = posicionAdyacente.CasillaAdyacenteEnLaDireccion(direccionDelProyectil); } if (puedeAplicarse) { Proyectil proyectil = new Proyectil(); Tablero.GetInstancia().AgregarEntidad(proyectil, posicionDelProyectil.X, posicionDelProyectil.Y); proyectil.Direccionar(this.aplicador.Direccion()); proyectil.CuandoPaseElTiempo(this.aplicador.PorcentajeDeRetardo()); proyectil.AnotarLanzador(this.aplicador); } else this.aplicador.NotificarExplosion(true); } catch (CasillaFueraDeRangoError e) { e.NoHacerNada(); this.aplicador.NotificarExplosion(true); } }
public void TestElProyectilExplotaPorqueSuProximaPosicionEstaFueraDeRango() { Proyectil proyectil = new Proyectil(); tablero.AgregarEntidad(proyectil, 0, 0); // esto se hace para que el proyectil apunte hacia arriba int[] arriba = { -1, 0 }; proyectil.Direccionar(arriba); // el proyectil explota porque se estrella contra la pared del tablero // (su proxima casilla esta fuera del tablero) proyectil.Explotar(); // asserts Assert.IsTrue(proyectil.FueDestruido()); // limpia el tablero tablero.Actualizar(); }