Пример #1
0
        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;
        }
Пример #2
0
 public double Distancia(Jugador jugadorReferencia)
 {
     Vector3 vector = this.Position - jugadorReferencia.Position;
     return vector.Length();
 }
Пример #3
0
        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;
            }
        }
Пример #4
0
 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);
         }
     }
 }
Пример #5
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;
            }
        }
Пример #8
0
        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);
 }
Пример #10
0
        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;
        }
Пример #11
0
        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;
                }
            }
        }
Пример #12
0
        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;
        }
Пример #13
0
        /// <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;
        }
Пример #14
0
        /// <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);
        }
Пример #15
0
 //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);
 }
Пример #16
0
        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");
        }