public void Update()
        {
            DistanciaAXwing = target.GetPosition() - posicion - origenDeDisparos;
            float distanciaLength = DistanciaAXwing.Length();

            isVisible = TGCVector3.Dot(-DistanciaAXwing, target.coordenadaDireccionCartesiana) > 0 &&
                        distanciaLength < distanciaMinimaAVisible;
            tiempoDesdeUltimoDisparo += VariablesGlobales.elapsedTime;
            if (tiempoDesdeUltimoDisparo > tiempoEntreDisparos)
            {
                tiempoDesdeUltimoDisparo = 0f;
                if (this.vida > 0 && distanciaLength < distanciaMinimaATarget)
                {
                    isActive = true;
                    CoordenadaEsferica direccionXwing = new CoordenadaEsferica(DistanciaAXwing.X,
                                                                               DistanciaAXwing.Y, DistanciaAXwing.Z);
                    VariablesGlobales.managerElementosTemporales.AgregarElemento(new Misil(
                                                                                     posicion + origenDeDisparos, direccionXwing, direccionXwing.GetRotation()
                                                                                     , "Misil\\misil_torreta.xml", Misil.OrigenMisil.ENEMIGO));
                }
                else
                {
                    isActive = false;
                }
            }
        }
Beispiel #2
0
 public XwingEnemigo(TGCVector3 posicionInicial, Xwing target, float velocidadInicial, CoordenadaEsferica direccionInicial)
 {
     posicion         = posicionInicial;
     velocidadGeneral = velocidadInicial;
     //Por defecto, se encuentra mirando hacia el z+
     this.coordenadaEsferica = direccionInicial;
     nave = new TgcSceneLoader().loadSceneFromFile(VariablesGlobales.mediaDir + "XWing\\X-Wing-TgcScene.xml");//@ésta deberia ser nuestra nave, no la enemiga!
     nave.Meshes.ForEach(mesh => {
         mesh.AutoTransformEnable = false;
         mesh.Transform           = TGCMatrix.Scaling(scale) *
                                    TGCMatrix.RotationYawPitchRoll(coordenadaEsferica.GetRotation().Y, coordenadaEsferica.GetRotation().X, coordenadaEsferica.GetRotation().Z) *
                                    TGCMatrix.Translation(posicion);
         //Shader
         if (VariablesGlobales.SHADERS)
         {
             Effect shader = VariablesGlobales.shaderManager.AskForEffect(ShaderManager.MESH_TYPE.SHADOW);
             if (shader != null)
             {
                 nave.Meshes.ForEach(m => m.Effect = shader);
             }
             VariablesGlobales.shaderManager.AddObject(this);
         }
     });
     this.target = target;
     //Calcula inicialmente en que direccion esta el xwing principal
     vectorDistancia  = CommonHelper.SumarVectores(target.GetPosition(), -posicion);
     coordenadaAXwing = new CoordenadaEsferica(vectorDistancia.X, vectorDistancia.Y, vectorDistancia.Z);
 }
Beispiel #3
0
        /**
         * Posicion nave: Posicion inicial del misil
         * coordenadaEsfericaP: Direccion y sentido del misil
         * Rotacion nave: Constante con el que misil se rota inicialmente para estar alineado a la trayectoria
         * pathscene: Path donde esta ubicado el mesh
         * */
        public Misil(TGCVector3 posicionInicial, CoordenadaEsferica coordenadaEsferica, TGCVector3 rotacionInicial, string pathScene, OrigenMisil origenMisil)
        {
            this.rotation           = rotacionInicial;
            this.coordenadaEsferica = coordenadaEsferica;
            this.position           = posicionInicial;
            this.scaleVector        = new TGCVector3(.2f, .2f, 4f);
            velocidadGeneral        = 1000;
            meshs    = new TgcMesh[1];
            meshs[0] = VariablesGlobales.loader.loadSceneFromFile(VariablesGlobales.mediaDir + pathScene).Meshes[0];
            meshs[0].AutoTransformEnable = false;
            matrizInicialTransformacion  = TGCMatrix.RotationY(FastMath.PI_HALF);

            if (VariablesGlobales.SHADERS)
            {
                Effect shader = VariablesGlobales.shaderManager.AskForEffect(ShaderManager.MESH_TYPE.SHADOW);
                if (shader != null)
                {
                    meshs[0].Effect = shader;
                }
                VariablesGlobales.shaderManager.AddObject(this);
            }
            switch (origenMisil)
            {
            case OrigenMisil.ENEMIGO:
                collisionObject = VariablesGlobales.physicsEngine.AgregarMisilEnemigo(meshs[0].BoundingBox.calculateSize());
                break;

            case OrigenMisil.XWING:
                collisionObject = VariablesGlobales.physicsEngine.AgregarMisilXwing(meshs[0].BoundingBox.calculateSize());
                break;
            }
        }
Beispiel #4
0
        public CoordenadaEsferica Diferencia(CoordenadaEsferica coordenadaEsferica)
        {
            float deltaAcimutal = FastMath.Abs(this.acimutal - coordenadaEsferica.acimutal);
            float deltaPolar    = FastMath.Abs(this.polar - coordenadaEsferica.polar);

            return(new CoordenadaEsferica(FastMath.Min(deltaAcimutal, FastMath.TWO_PI - deltaAcimutal),
                                          FastMath.Min(deltaPolar, FastMath.TWO_PI - deltaPolar)));
        }
        public static TGCVector3 MoverPosicionEnDireccionCoordenadaEsferica(TGCVector3 posicion,
                                                                            CoordenadaEsferica coordenadaEsferica, float speed, float timeLapse)
        {
            float x = posicion.X + speed * coordenadaEsferica.GetXCoord() * timeLapse;
            float y = posicion.Y + speed * coordenadaEsferica.GetYCoord() * timeLapse;
            float z = posicion.Z + speed * coordenadaEsferica.GetZCoord() * timeLapse;

            return(new TGCVector3(x, y, z));
        }
Beispiel #6
0
        /**
         * Devuelve la posicion inicial desde donde sale el misil en funcion de la posicion y la rotacion de la nave.
         * */
        private TGCVector3 CalcularPosicionInicialMisil()
        {
            //Random de las 4 opciones posibles de caniones
            Random random         = new Random();
            int    canion         = (int)Math.Round(random.NextDouble() * 4);
            int    signo          = 0;
            bool   canionInferior = false;

            //Caniones izquierdos o derechos
            if (canion == 0 || canion == 2)
            {
                signo = 1;
            }
            else
            {
                signo = -1;
            }
            //Caniones inferiores o superiores
            if (canion == 2 || canion == 3)
            {
                canionInferior = true;
            }
            else
            {
                canionInferior = false;
            }
            //Delta en la direccion nave (para que no parezca que sale de atras)
            TGCVector3 deltaDireccionNave = new TGCVector3(coordenadaEsferica.GetXYZCoord() * DISTANCIA_ORIGEN_MISIL_DIRECCION_NAVE);

            //Delta en la direccion ortogonal a la direccion de la nave (para que salga desde alguna de las alas)
            //Caniones inferiores
            if (canionInferior)
            {
                CoordenadaEsferica direccionOrtogonal = new CoordenadaEsferica(coordenadaEsferica.acimutal + (FastMath.PI / 2) * signo, FastMath.PI / 2 + EXTRA_ANGULO_POLAR_CANION_ABAJO);
                TGCVector3         deltaOrtogonalNave =
                    new TGCVector3(direccionOrtogonal.GetXYZCoord() * DISTANCIA_ORIGEN_MISIL_DIRECCION_ORTOGONAL);
                return(CommonHelper.SumarVectores(CommonHelper.SumarVectores(GetPosition(), deltaDireccionNave), deltaOrtogonalNave));
            }
            else
            //Caniones superiores
            {
                CoordenadaEsferica direccionOrtogonal = new CoordenadaEsferica(coordenadaEsferica.acimutal + (FastMath.PI / 2) * signo, FastMath.PI / 2);
                TGCVector3         deltaOrtogonalNave =
                    new TGCVector3(direccionOrtogonal.GetXCoord() * DISTANCIA_ORIGEN_MISIL_DIRECCION_ORTOGONAL,
                                   direccionOrtogonal.GetYCoord() * DISTANCIA_ORIGEN_MISIL_DIRECCION_ORTOGONAL,
                                   direccionOrtogonal.GetZCoord() * DISTANCIA_ORIGEN_MISIL_DIRECCION_ORTOGONAL);
                return(CommonHelper.SumarVectores(CommonHelper.SumarVectores(GetPosition(), deltaDireccionNave), deltaOrtogonalNave));
            }
        }
Beispiel #7
0
        /**
         * Chequea dado el radio de apertura y la direccion en que mira la nave enemigo, si esta viendo al xwing
         * principal.
         **/
        public bool XwingSeEncuentraEnRadioDeVisibilidad()
        {
            vectorDistancia = CommonHelper.SumarVectores(target.GetPosition(), -posicion);
            float largoDistancia = vectorDistancia.Length();

            visible = TGCVector3.Dot(-vectorDistancia, target.coordenadaDireccionCartesiana) > 0 &&
                      largoDistancia < 2000;
            if (largoDistancia > DistanciaMinimaPersecucion && target.GetPosition().Y > AlturaMinimaChequeoXwing)
            {
                coordenadaAXwing = new CoordenadaEsferica(vectorDistancia.X, vectorDistancia.Y, vectorDistancia.Z);
                CoordenadaEsferica dif = this.coordenadaEsferica.Diferencia(coordenadaAXwing);
                return(dif.acimutal < radioAperturaVisibilidad && dif.polar < radioAperturaVisibilidad &&
                       vectorDistancia.Length() < distanciaLejanaVisibilidad);
            }
            else
            {
                return(false);
            }
        }
Beispiel #8
0
        public Bomba(TGCVector3 position, CoordenadaEsferica coordenadaEsferica)
        {
            bomba = VariablesGlobales.loader.loadSceneFromFile(VariablesGlobales.mediaDir + "Bomb\\bomb-TgcScene.xml").Meshes[0];
            bomba.AutoTransformEnable = false;

            this.posicion      = position;
            this.coordEsferica = coordenadaEsferica.GetXYZCoord();
            escala             = new TGCVector3(.05f, .05f, .05f);
            VariablesGlobales.managerSonido.ReproducirSonido(SoundManager.SONIDOS.XWING_BOMB);
            //@toy en seria duda de esto
            if (VariablesGlobales.SHADERS)
            {
                Effect shader = VariablesGlobales.shaderManager.AskForEffect(ShaderManager.MESH_TYPE.SHADOW);
                if (shader != null)
                {
                    bomba.Effect = shader;
                }
                VariablesGlobales.shaderManager.AddObject(this);
            }
        }
Beispiel #9
0
 public void Update()
 {
     timer += VariablesGlobales.elapsedTime;
     //Que chequee la posicion de la nave enemiga cada cierto tiempo, por ejemplo 2 segundos
     if (timer > intervaloParaChequearXwing)
     {
         //Lo pongo en otro if porque c# no hace lazy evaluating, es decir, evalua esa funcion tan cara
         // aunque la primer parte haya dado falso
         if (vivo && XwingSeEncuentraEnRadioDeVisibilidad())
         {
             timer = 0;
             Disparar();
             activado = true;
         }
     }
     if (activado && vivo)
     {
         Moverse();
     }
     //Dirigirse en direccion al xwing
     coordenadaEsferica = coordenadaAXwing;
 }
Beispiel #10
0
 private void ActualizarCoordenadaEsferica()
 {
     coordenadaEsferica = new CoordenadaEsferica(this.rotation);
 }