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; } } }
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); }
/** * 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; } }
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)); }
/** * 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)); } }
/** * 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); } }
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); } }
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; }
private void ActualizarCoordenadaEsferica() { coordenadaEsferica = new CoordenadaEsferica(this.rotation); }