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); }
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; } } }
/** * 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 override void Update() { //@hacer que se mueva con el xwing worldsphere.Position = pivot.GetPosition(); worldsphere.Rotation += new TGCVector3(.00001f, .00001f, .00001f);//creo que agregar elapsedtime no es necesario }