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) { if (contexto.personaje.ContieneElementoEnPosicionDeMochila(numeroATirar)) { //Lo hacemos negativo para invertir hacia donde apunta el vector en 180 grados var z = -(float)Math.Cos(contexto.personaje.mesh.Rotation.Y) * 150; var x = -(float)Math.Sin(contexto.personaje.mesh.Rotation.Y) * 150; //Direccion donde apunta el personaje, sumamos las coordenadas obtenidas a la posición del personaje para que //el vector salga del personaje. var posicionElemento = contexto.personaje.mesh.Position + new Vector3(x, 0, z); posicionElemento.Y = contexto.terreno.CalcularAltura(posicionElemento.X, posicionElemento.Z); var elementoATirar = contexto.personaje.DarElementoEnPosicionDeMochila(numeroATirar); elementoATirar.posicion(posicionElemento); var posiblesColisiones = new List <Elemento>(); foreach (var elem in contexto.optimizador.ElementosColision) { //TODO. Optimizar esto para solo objetos cernanos!!!!!!!! if (ControladorColisiones.CuadradoColisionaCuadrano(elementoATirar.BoundingBox(), elem.BoundingBox())) { posiblesColisiones.Add(elem); if (!elem.AdmiteMultipleColision()) { break; } } } foreach (var elem in posiblesColisiones) { elem.ProcesarColisionConElemento(elementoATirar); } //De todas formas se procesa el tirado del elemento. contexto.elementos.Add(elementoATirar); contexto.optimizador.ForzarActualizacionElementosColision(); contexto.personaje.Dejar(elementoATirar); } }
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)); } }