예제 #1
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;
            }
        }
예제 #2
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;
        }
예제 #3
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;
        }
예제 #4
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;
            }
        }
        /// <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);
        }