public void AccionConPelota(Jugador jugador, float elapsedTimePelota, Pelota pelota) { if (!this.inteligenciaArtificial) { return; } //TODO revisar ¿Porque con pelot no se mveria?? if (!this.TengoQueMoverme(jugador)) { jugador.playAnimation(jugador.AnimacionParado, true); return; } Vector3 direccion = jugador.EquipoPropio.ArcoRival.Red.GetPosition() - jugador.Position; direccion.Normalize(); //Por ahora hago esto... :p, pero hay que pensar una IA real :) double tamanoCanchaParcial = Partido.Instance.Cancha.Size.Length() / 3; double distanciaArco = (jugador.EquipoPropio.ArcoRival.Red.GetPosition() - jugador.Position).Length(); double distanciaArcoPropio = (jugador.EquipoPropio.ArcoPropio.Red.GetPosition() - jugador.Position).Length(); if (jugador.Atacando) { if (distanciaArco < tamanoCanchaParcial) { pelota.Patear(direccion, this.semilla.Next(this.maximoFuerzaPatear * MULTIPLICADOR_FUERZA_PATEAR)); } else { if (distanciaArcoPropio < tamanoCanchaParcial / 3) { pelota.Patear(direccion, this.maximoFuerzaPatear * MULTIPLICADOR_FUERZA_PATEAR); } else { pelota.Mover(direccion); } } } else { pelota.Patear(direccion, this.semilla.Next(this.maximoFuerzaPatear * MULTIPLICADOR_FUERZA_PATEAR)); } jugador.PelotaDominada = false; }
public double Distancia(Jugador jugadorReferencia) { Vector3 vector = this.Position - jugadorReferencia.Position; return vector.Length(); }
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; } }
private void CalcularRotacion(Jugador jugador, Vector3 movimiento) { if (movimiento.X < 0) { if (movimiento.Z > 0) { jugador.Rotation = new Vector3(0, -(float)Math.PI * 5 / 4, 0); } else if (movimiento.Z < 0) { jugador.Rotation = new Vector3(0, (float)Math.PI * 2.5f, 0); } else { jugador.Rotation = new Vector3(0, (float)Math.PI / 2, 0); } } else if (movimiento.X > 0) { if (movimiento.Z > 0) { jugador.Rotation = new Vector3(0, (float)Math.PI * 5 / 4, 0); } else if (movimiento.Z < 0) { jugador.Rotation = new Vector3(0, -(float)Math.PI / 4, 0); } else { jugador.Rotation = new Vector3(0, -(float)Math.PI / 2, 0); } } else { if (movimiento.Z > 0) { jugador.Rotation = new Vector3(0, -(float)Math.PI, 0); } else { jugador.Rotation = new Vector3(0, 0, 0); } } }
private bool TengoQueMoverme(Jugador jugador) { if (jugador.Equals(jugador.EquipoPropio.JugadorMasCercanoPelota())) { return true; } return false; }
/// <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); }
//TODO esto lo deberia ejecutar desde el animate and render o desde colisionastecon? public void AccionConPelota(Jugador jugador, float elapsedTime, Pelota pelota) { Vector3 movimiento = this.CalcularPosicionSegunInput(jugador, elapsedTime, d3dInput); //Si presiono S, paso la pelota if (this.d3dInput.keyPressed(Key.S)) { jugador.Pelota.Pasar(jugador.EquipoPropio.JugadorMasCercano(jugador).Position, MULTIPLICADOR_FUERZA_PASAR); jugador.PelotaDominada = false; return; } //Si presiono A, paso la pelota if (this.d3dInput.keyPressed(Key.A)) { jugador.Pelota.Centro(jugador.EquipoPropio.JugadorMasCercano(jugador).Position, MULTIPLICADOR_FUERZA_CENTRO); jugador.PelotaDominada = false; return; } //Si presiono D, comienzo a acumular cuanto patear if (this.d3dInput.keyDown(Key.D)) { if (this.acumuladoPatear < this.maximoFuerzaPatear) { this.acumuladoPatear += elapsedTime + 0.2f; } else { Vector3 direccion = CalcularDireccionDePateado(jugador, pelota, movimiento); jugador.Pelota.Patear(direccion, this.maximoFuerzaPatear * MULTIPLICADOR_FUERZA_PATEAR); jugador.PelotaDominada = false; this.acumuladoPatear = minimoFuerzaPatear; return; } } //Si suelto D pateo la pelota con la fuerza acumulada if (this.d3dInput.keyUp(Key.D) && this.acumuladoPatear != 0) { Vector3 direccion = CalcularDireccionDePateado(jugador, pelota, movimiento); jugador.Pelota.Patear(direccion, this.acumuladoPatear * MULTIPLICADOR_FUERZA_PATEAR); jugador.PelotaDominada = false; this.acumuladoPatear = minimoFuerzaPatear; return; } //RENE: Revisar esto, si el jugador deja de coslionar con la pelota, entonces la suelta y no la tieen mas, esto arregla el tema de ir para atras, el codigo no es lindo, hace tu magia! if (this.SigoColisionadoConPelota(pelota, jugador)) { if (movimiento != Vector3.Empty) { pelota.Mover(movimiento); } } else { jugador.PelotaDominada = false; } }
public double Distancia(Jugador jugadorReferencia) { Vector3 vector = this.Position - jugadorReferencia.Position; return(vector.Length()); }
private static Vector3 CalcularDireccionDePateado(Jugador jugador, Pelota pelota) { return(pelota.Position - jugador.Position); }
public Jugador JugadorMasCercanoPelota(Jugador jugadorExcluido) { Jugador jugadorMasCercano = null; foreach (Jugador jugador in this.jugadores) { if (!jugador.Equals(jugadorExcluido)) { if (jugadorMasCercano == null) { jugadorMasCercano = jugador; } else if (jugadorMasCercano.DistanciaPelota() > jugador.DistanciaPelota()) { jugadorMasCercano = jugador; } } } return jugadorMasCercano; }
public void NotificarPelotaDominada(Jugador jugador) { if (this.jugadores.Contains(jugador)) { foreach (Jugador jugadorAtacando in this.jugadores) { jugadorAtacando.Atacando = true; if (jugador.Equals(jugadorAtacando)) { jugadorAtacando.PelotaDominada = true; } else { jugadorAtacando.PelotaDominada = false; } } } else { foreach (Jugador jugadorDefendiendo in this.jugadores) { jugadorDefendiendo.Atacando = false; jugadorDefendiendo.PelotaDominada = false; } } }
public Jugador JugadorMasCercano(Jugador jugadorReferencia) { Jugador jugadorMasCercano = null; foreach (Jugador jugador in this.jugadores) { if (!jugador.Equals(jugadorReferencia)) { if (jugadorMasCercano == null) { jugadorMasCercano = jugador; } else if (jugadorMasCercano.Distancia(jugadorReferencia) > jugador.Distancia(jugadorReferencia)) { jugadorMasCercano = jugador; } } } return jugadorMasCercano; }
/// <summary> /// Creo un jugador basado en el Robot de TGC /// </summary> /// <param name="posicion">Posicion donde va a estar el jugador</param> /// <param name="angulo">El angulo donde va a mirar</param> /// <param name="pathRecursos"></param> /// <param name="nombreTextura">Que textura va a tener</param> /// <returns></returns> private Jugador CrearJugador(string pathRecursos, string nombreTextura, Vector3 posicion, float angulo, IJugadorMoveStrategy strategy, Pelota pelota) { //Cargar personaje con animaciones TgcSkeletalMesh personaje = new TgcSkeletalLoader().loadMeshAndAnimationsFromFile( pathRecursos + Settings.Default.meshFolderPlayer + Settings.Default.meshFilePlayer, pathRecursos + Settings.Default.meshFolderPlayer, new string[] { pathRecursos + Settings.Default.meshFolderPlayer + Settings.Default.animationWalkFilePlayer, pathRecursos + Settings.Default.meshFolderPlayer + Settings.Default.animationRunFilePlayer, pathRecursos + Settings.Default.meshFolderPlayer + Settings.Default.animationStopFilePlayer, } ); //Le cambiamos la textura //personaje.changeDiffuseMaps(new TgcTexture[] { // TgcTexture.createTexture(pathRecursos + Settings.Default.meshFolderPlayer + nombreTextura) // }); //TODO cambiar por matrices personaje.AutoTransformEnable = true; //Configurar animacion inicial personaje.playAnimation(Settings.Default.animationStopPlayer, true); personaje.Position = posicion; //Lo Escalo porque es muy grande personaje.Scale = new Vector3(0.5f, 0.5f, 0.5f); personaje.rotateY(Geometry.DegreeToRadian(angulo)); //Recalculo las normales para evitar problemas con la luz personaje.computeNormals(); Jugador jugador = new Jugador(personaje, strategy, pelota); jugador.ShadowEffect = TgcShaders.loadEffect(pathRecursos + "Shaders\\MeshPlanarShadows.fx"); jugador.LightEffect = TgcShaders.loadEffect(pathRecursos + "Shaders\\SkeletalMeshMultiplePointLight.fx"); return jugador; }
/// <summary> Cargo las colisiones para un jugador particular</summary> /// <param name="equipoPropio"> Cargo a todos menos a mi</param> /// <param name="equiporival"> Cargo a todos los jugadores</param> /// <param name="partido"> Necesario para otras cosas colisionables</param> /// <param name="jugador"> Jugador al cual tengo que cargarles las colisiones</param> private void CargarLosObstaculosAlJugador(Equipo equipoPropio, Equipo equiporival, Partido partido, Jugador jugador) { List<IColisionable> colisionables = new List<IColisionable>(); colisionables.AddRange(partido.Cancha.LimitesCancha); colisionables.Add(partido.Cancha); colisionables.AddRange(partido.ArcoLocal.GetColisionables()); colisionables.AddRange(partido.ArcoVisitante.GetColisionables()); /* TODO quito las colosiones hasta tenerlas mejor lo pidio el profe foreach (Jugador jugadorColision in equipoPropio.Jugadores) { if (!jugador.Equals(jugadorColision)) { colisionables.Add(jugadorColision); } } foreach (Jugador jugadorColision in equiporival.Jugadores) { colisionables.Add(jugadorColision); }*/ jugador.CollisionManager = new BoxCollisionManager(colisionables); }
//TODO De aca para abajo hay que ver como llegar aca por ahora se llega con el singleton PUAJIS public void NotificarPelotaDominada(Jugador jugador) { this.equipoLocal.NotificarPelotaDominada(jugador); this.equipoVisitante.NotificarPelotaDominada(jugador); }
public override void Init() { //Cargar jugador y pelota this.pelota = this.CrearPelota(MediaDir); this.jugador = this.CrearJugador(MediaDir); //Camara en 1ra persona //GuiController.Instance.FpsCamera.Enable = true; //GuiController.Instance.FpsCamera.MovementSpeed = 400f; //GuiController.Instance.FpsCamera.JumpSpeed = 300f; //GuiController.Instance.FpsCamera.setCamera(new Vector3(0, 150, 200), new Vector3(0, 80, 0)); //Cargar Shader personalizado de MultiDiffuseLights /* * Cargar Shader personalizado de MultiDiffuseLights * Este Shader solo soporta TgcMesh con RenderType DIFFUSE_MAP (que son las unicas utilizadas en este ejemplo) * El shader toma 4 luces a la vez para iluminar un mesh. * Pero como hacer 4 veces los calculos en el shader es costoso, de cada luz solo calcula el componente Diffuse. */ this.meshMultiDiffuseLights = TgcShaders.loadEffect(ShadersDir + "Shaders\\MeshMultiplePointLight.fx"); this.skeletalMeshPointLight = TgcShaders.loadEffect(ShadersDir + "Shaders\\SkeletalMeshMultiplePointLight.fx"); this.luces = new List<Luz>(); //Crear 4 mesh para representar las 4 para la luces. Las ubicamos en distintas posiciones del escenario, cada una con un color distinto. luces.Add(new Luz(TgcBox.fromSize(new Vector3(40, 150, 100), new Vector3(10, 10, 10), Color.BlueViolet), Color.HotPink, new Vector3(-40, 40, 400))); luces.Add(new Luz(TgcBox.fromSize(new Vector3(-40, 150, 100), new Vector3(10, 10, 10), Color.LightSteelBlue), Color.Blue, new Vector3(-40, 60, 400))); luces.Add(new Luz(TgcBox.fromSize(new Vector3(40, 150, -100), new Vector3(10, 10, 10), Color.Green), Color.Green, new Vector3(-40, 80, 400))); luces.Add(new Luz(TgcBox.fromSize(new Vector3(-40, 150, -100), new Vector3(10, 10, 10), Color.Orange), Color.Orange, new Vector3(-40, 100, 400))); this.piso = TgcBox.fromSize(new Vector3(0, 0, 0), new Vector3(400, 0, 400), TgcTexture.createTexture(MediaDir + Settings.Default.textureMenuField)); //Modifiers //GuiController.Instance.Modifiers.addFloat("lightIntensity", 0, 150, 38); //GuiController.Instance.Modifiers.addFloat("lightAttenuation", 0.1f, 2, 0.15f); //Color de fondo //GuiController.Instance.BackgroundColor = Color.Black; //test carteles this.cartel1 = new TgcSceneLoader().loadSceneFromFile(MediaDir + "Cartel\\Cartel-TgcScene.xml").Meshes[0]; this.cartelEffect = TgcShaders.loadEffect(ShadersDir + "Shaders\\CartelShader.fx"); }