public void AccionSinPelota(Jugador jugador, float elapsedTime) { if (!this.inteligenciaArtificial) { return; } if (!this.TengoQueMoverme(jugador)) { jugador.playAnimation(jugador.AnimacionParado, true); return; } //Multiplicar la velocidad por el tiempo transcurrido, para no acoplarse al CPU float velocidad = jugador.VelocidadCaminar * elapsedTime; //Obtengo el vector direccion donde esta la pelota Vector3 movimiento = new Vector3(jugador.Pelota.Position.X - jugador.Position.X, 0, jugador.Pelota.Position.Z - jugador.Position.Z); movimiento.Normalize(); jugador.playAnimation(jugador.AnimacionCorriendo, true); Vector3 lastPos = jugador.Position; jugador.move(movimiento * velocidad); //Calculo para donde tengo que rotar dependiendo de donde apunta la direccion this.CalcularRotacion(jugador, movimiento); //Detecto las colisiones if (jugador.CollisionManager.DetectarColisiones(jugador, lastPos)) { //Si hubo colision, restaurar la posicion anterior jugador.Position = lastPos; } }
/// <summary> /// Calculo cual es la proxima posicion en base a lo que tocan en el teclado /// </summary> /// <param name="elapsedTime"> Tiempo en segundos transcurridos desde el último frame</param> public Vector3 CalcularPosicionSegunInput(Jugador jugador, float elapsedTime, TgcD3dInput d3dInput) { //Calcular proxima posicion de personaje segun Input Vector3 movimiento = Vector3.Empty; Vector3 direccion = new Vector3(0, 0, 0); bool moving = false; bool correr = false; //Multiplicar la velocidad por el tiempo transcurrido, para no acoplarse al CPU float velocidad = jugador.VelocidadCaminar * elapsedTime; //Si presiono W corre if (d3dInput.keyDown(Key.W)) { //Multiplicar la velocidad por el tiempo transcurrido, para no acoplarse al CPU velocidad = jugador.VelocidadCorrer * elapsedTime; correr = true; } //Si suelto, vuelve a caminar if (d3dInput.keyUp(Key.W)) { correr = false; } //Adelante if (d3dInput.keyDown(Key.UpArrow)) { movimiento.Z = velocidad; direccion.Y = (float)Math.PI; moving = true; } //Atras if (d3dInput.keyDown(Key.DownArrow)) { movimiento.Z = -velocidad; //No hago nada en este caso por la rotacion moving = true; } //Derecha if (d3dInput.keyDown(Key.RightArrow)) { movimiento.X = velocidad; direccion.Y = -(float)Math.PI / 2; moving = true; } //Izquierda if (d3dInput.keyDown(Key.LeftArrow)) { movimiento.X = -velocidad; direccion.Y = (float)Math.PI / 2; moving = true; } //Diagonales, lo unico que hace es girar al jugador, el movimiento se calcula con el ingreso de cada tecla. if (d3dInput.keyDown(Key.UpArrow) && d3dInput.keyDown(Key.Right)) { direccion.Y = (float)Math.PI * 5 / 4; } if (d3dInput.keyDown(Key.UpArrow) && d3dInput.keyDown(Key.LeftArrow)) { direccion.Y = (float)Math.PI * 3 / 4; } if (d3dInput.keyDown(Key.DownArrow) && d3dInput.keyDown(Key.LeftArrow)) { direccion.Y = (float)Math.PI / 4; } if (d3dInput.keyDown(Key.DownArrow) && d3dInput.keyDown(Key.RightArrow)) { direccion.Y = (float)Math.PI * 7 / 4; } //Si hubo desplazamiento if (moving) { //Activar animacion que corresponda if (correr) { jugador.playAnimation(jugador.AnimacionCorriendo, true); } else { jugador.playAnimation(jugador.AnimacionCaminando, true); } //Aplicar movimiento hacia adelante o atras segun la orientacion actual del Mesh Vector3 lastPos = jugador.Position; jugador.move(movimiento); jugador.Rotation = direccion; //Detecto las colisiones if (jugador.CollisionManager.DetectarColisiones(jugador, lastPos)) { //Si hubo colision, restaurar la posicion anterior jugador.Position = lastPos; } } //Si no se esta moviendo, activar animacion de Parado else { jugador.playAnimation(jugador.AnimacionParado, true); } return(movimiento); }