public void Ejecutar(SuvirvalCraft contexto, float elapsedTime) { contexto.personaje.mesh.playAnimation("Parado", true); //Simulamos el descanso del personaje contexto.personaje.incrementoResistenciaFisica(elapsedTime); ObstaculosInteractuar.Clear(); foreach (var elem in contexto.optimizador.ElementosColision) { //TODO. Optimizar esto para solo objetos cernanos!!!!!!!! if (ControladorColisiones.EsferaColisionaCuadrado(contexto.personaje.GetAlcanceInteraccionEsfera(), elem.BoundingBox())) { ObstaculosInteractuar.Add(elem); if (!elem.AdmiteMultipleColision()) { break; } } } foreach (var elem in ObstaculosInteractuar) { elem.procesarInteraccion(Accion, contexto, elapsedTime); contexto.informativo.Text = elem.getAcciones(); } }
private void BuscarColisionConGolpe(SuvirvalCraft contexto) { elementoEnColision = null; //Buscamos si esta al alcance alguno de los obstáculos foreach (var elem in contexto.optimizador.ElementosColision) { if (ControladorColisiones.EsferaColisionaCuadrado(contexto.personaje.GetAlcanceInteraccionEsfera(), elem.BoundingBox())) { elementoEnColision = elem; //En principio solo se puede golpear un obstaculo a la vez. break; } } }
public void Ejecutar(SuvirvalCraft contexto, float elapsedTime) { float movimiento; //Aplicar movimiento hacia adelante o atras segun la orientacion actual del Mesh var lastPos = contexto.personaje.mesh.Position; if (MovimientoRapido) { movimiento = sentido * contexto.personaje.correr(elapsedTime); } else { movimiento = sentido * contexto.personaje.VelocidadCaminar; } //Aplicamos el movimiento var xm = FastMath.Sin(contexto.personaje.mesh.Rotation.Y) * movimiento; var zm = FastMath.Cos(contexto.personaje.mesh.Rotation.Y) * movimiento; var movementVector = new Vector3(xm, 0, zm); contexto.personaje.mesh.move(movementVector * elapsedTime); contexto.personaje.mesh.Position = new Vector3(contexto.personaje.mesh.Position.X, contexto.terreno.CalcularAltura(contexto.personaje.mesh.Position.X, contexto.personaje.mesh.Position.Z), contexto.personaje.mesh.Position.Z); //Para saber si sale o no del mapa //TODO. Queda pendiente aplicarlo a los animales y cuando salta para adelante. if (!FuncionesMatematicas.Instance.EstaDentroDelCuadrado(contexto.personaje.mesh.Position, contexto.esquina)) { contexto.personaje.mesh.Position = lastPos; return; } contexto.personaje.ActualizarEsferas(); //Detectar colisiones var collide = false; foreach (var elem in contexto.optimizador.ElementosColision) { if (ControladorColisiones.EsferaColisionaCuadrado(contexto.personaje.GetBoundingEsfera(), elem.BoundingBox())) { collide = true; elem.procesarColision(contexto.personaje, elapsedTime, contexto.elementos, movimiento, movementVector, lastPos); break; } } if (!collide) { if (MovimientoRapido) { //Activar animacion de corriendo contexto.personaje.mesh.playAnimation("Correr", true); } else { //Activar animacion de caminando contexto.personaje.mesh.playAnimation("Caminando", true); } } //Si hubo mivimiento actualizamos el centro del SkyBox para simular que es infinito, tambien el del piso if (!contexto.personaje.mesh.Position.Equals(lastPos)) { contexto.ActualizarPosicionSkyBox(new Vector3(contexto.personaje.mesh.Position.X - lastPos.X, 0, contexto.personaje.mesh.Position.Z - lastPos.Z)); contexto.ActualizarPosicionSuelo(new Vector3(contexto.personaje.mesh.Position.X - lastPos.X, 0, contexto.personaje.mesh.Position.Z - lastPos.Z)); } }