private void ProcesarThings() { if (thingASeguir != null) { galaxia.Procesar(segundosTranscurridos, thingASeguir.Centro, RadioSectoresCercanosAProcesar); } if (!enDemo) { if (naveJugador.Eliminado == true) { DialogoReiniciar guiDialogoReiniciar = new DialogoReiniciar("Fuiste destruido.", true); guiEngine.Root.AddChildWindow( guiDialogoReiniciar, new Point( (guiEngine.Root.Size.Width - guiDialogoReiniciar.Size.Width) / 2, (guiEngine.Root.Size.Height - guiDialogoReiniciar.Size.Height) / 2)); guiEngine.Root.Focus = guiDialogoReiniciar; } } else { segundosDemoEnElMismoThing += segundosTranscurridos; if (segundosDemoEnElMismoThing > 30.0f || thingASeguir == null || thingASeguir.Eliminado) { segundosDemoEnElMismoThing = 0.0f; //Busco un nuevo thing a seguir al azar System.Random rnd = new System.Random((int)DateTime.Now.Ticks); thingASeguir = null; int intentos = 30; while (thingASeguir == null && intentos > 0) { int x = rnd.Next(-galaxia.TamanioEnSectores.Width / 2, galaxia.TamanioEnSectores.Width / 2); int y = rnd.Next(-galaxia.TamanioEnSectores.Height / 2, galaxia.TamanioEnSectores.Height / 2); Sector sector = galaxia.GetSector(new SectorID(x, y)); foreach (Thing thing in sector.Things) { if (thing is ThingNave) { thingASeguir = thing; break; } } intentos--; } } } }
public override Sector CrearSector(SectorID sectorID) { Sector sector = new Sector(galaxia, sectorID, null); galaxia.AgregarSector(sector); if (sectorID.X == 4 && sectorID.Y == 3) { ThingAgujeroDeGusano ta1 = new ThingAgujeroDeGusano(galaxia, sector.Centro + new Vector2(0, Sector.TamanioSector / 2 - 1 - 300), 300); ThingAgujeroDeGusano ta2 = new ThingAgujeroDeGusano(galaxia, galaxia.GetSector(new SectorID(4, 5)).Centro + new Vector2(0, -Sector.TamanioSector / 2 + 1 - 300), 300); ta1.AgujeroDestino = ta2; ta2.AgujeroDestino = ta1; } else if (sectorID.X == 4 && sectorID.Y == 4) { new ThingPlaneta(galaxia, sector.Centro + new Vector2(Sector.TamanioSector / 2 - 1, Sector.TamanioSector / 2 - 1), 300); new ThingPlaneta(galaxia, sector.Centro + new Vector2(-Sector.TamanioSector / 2 + 1, -Sector.TamanioSector / 2 + 1), 300); new ThingPlaneta(galaxia, sector.Centro + new Vector2(Sector.TamanioSector / 2 - 1, -Sector.TamanioSector / 2 + 1), 300); new ThingPlaneta(galaxia, sector.Centro + new Vector2(-Sector.TamanioSector / 2 + 1, Sector.TamanioSector / 2 - 1), 300); new ThingPlaneta(galaxia, sector.Centro + new Vector2(-Sector.TamanioSector / 2 + 1, 0), 300); new ThingPlaneta(galaxia, sector.Centro + new Vector2(+Sector.TamanioSector / 2 - 1, 0), 300); new ThingPlaneta(galaxia, sector.Centro + new Vector2(0, -Sector.TamanioSector / 2 + 1), 300); new ThingPlaneta(galaxia, sector.Centro + new Vector2(0, +Sector.TamanioSector / 2 - 1), 300); } return(sector); }
public override void OnImpacto(Thing thing) { if (thing.Eliminado) { return; } Random rnd = new Random((int)DateTime.Now.Ticks); if (rnd.Next(0, 2) == 1) { if (thing is ThingDaniable) { ((ThingDaniable)thing).ProcesarDanio(this, 1000.0f); } } else { while (true) { SectorID sectorIDDestino = new SectorID( rnd.Next(-Galaxia.TamanioEnSectores.Width / 2, Galaxia.TamanioEnSectores.Width / 2), rnd.Next(-Galaxia.TamanioEnSectores.Height / 2, Galaxia.TamanioEnSectores.Height / 2)); Sector sectorDestino = Galaxia.GetSector(sectorIDDestino); Vector2 posicionEnSector = new Vector2( rnd.Next(-Sector.TamanioSector / 2, -Sector.TamanioSector / 2), rnd.Next(-Sector.TamanioSector / 2, -Sector.TamanioSector / 2)); Vector2 posicionFinal = sectorDestino.Centro + posicionEnSector; if (Galaxia.ColisionaConThing(thing, posicionFinal, thing.Tamanio, thing.RotacionEnGrados) == null) { Galaxia.ActualizarCentroThing(thing, posicionFinal); break; } } } }
public override Sector CrearSector(SectorID sectorID) { Faccion faccion = null; if (sectorID.X > -TamanioEnSectores / 2 && sectorID.X < TamanioEnSectores / 2 && sectorID.Y > -TamanioEnSectores / 2 && sectorID.Y < TamanioEnSectores / 2) { int x = sectorID.X + TamanioEnSectores / 2; int y = sectorID.Y + TamanioEnSectores / 2; Color color = bmpUniverso.GetPixel(x, y); faccion = facciones[color.R / 8]; } Sector sector = new Sector(galaxia, sectorID, faccion); galaxia.AgregarSector(sector); bool puedeSerNebula = true; bool puedeTenerNaves = false; if (rndCreacionSectores.Next(0, ProbabilidadAgujeroNegro) == 0) { //Agrego un agujero negro puedeSerNebula = false; //Los sectores con agujeros negros no deben contener nebulas float diametro = rndCreacionSectores.Next(100, 500); float radioAlcance = rndCreacionSectores.Next(1000, 3000); float velocidadRotacion = rndCreacionSectores.Next(90, 360); Vector2 posicion = sector.BuscarEspacioVacio(diametro / 2 + DistanciaMinimaEntreThingsEnSector); ThingAgujeroNegro t = new ThingAgujeroNegro(galaxia, posicion, diametro); t.RadioAccion = radioAlcance; t.VelocidadRotacion = velocidadRotacion; } else if (rndCreacionSectores.Next(0, ProbabilidadEstrella) == 0) { //Agrego una estrella float diametro = rndCreacionSectores.Next(100, 500); float radioAlcance = rndCreacionSectores.Next(1000, 3000); Vector2 posicion = sector.BuscarEspacioVacio(diametro / 2 + DistanciaMinimaEntreThingsEnSector); ThingEstrella t = new ThingEstrella(galaxia, posicion, diametro); t.RadioAccion = radioAlcance; } else if (rndCreacionSectores.Next(0, ProbabilidadPlaneta) == 0) { //Agrego un planeta, para lo cual primero determino si va a tener o no estacion espacial, //ya que de tenerla, tengo que buscar en el sector un espacio lo suficientemente grande como para //que entre el planeta y la estacion espacial en orbita puedeTenerNaves = true; float diametroPlaneta = rndCreacionSectores.Next(100, 500); Vector2 tamanioEstacionEspacial = new Vector2(200, 200); bool tieneEstacionEspacial = (rndCreacionSectores.Next(0, ProbabilidadEstacionEspacialOrbitaPlaneta) == 0); float radioOrbitaEstacionEspacial = diametroPlaneta / 2.0f + tamanioEstacionEspacial.X / 2.0f + (float)rndCreacionSectores.Next(100, 1000); Vector2 posicionPlaneta; if (tieneEstacionEspacial) { posicionPlaneta = sector.BuscarEspacioVacio(diametroPlaneta / 2 + radioOrbitaEstacionEspacial + tamanioEstacionEspacial.X / 2 + DistanciaMinimaEntreThingsEnSector); } else { posicionPlaneta = sector.BuscarEspacioVacio(diametroPlaneta / 2 + DistanciaMinimaEntreThingsEnSector); } ThingPlaneta planeta = new ThingPlaneta(galaxia, posicionPlaneta, diametroPlaneta); if (tieneEstacionEspacial) { //Agrego una estación espacial en orbita! float velocidadRotacionOrbita = (float)rndCreacionSectores.Next(100, 1000) / 100.0f; Vector2 posicionEstacion = planeta.Centro + new Vector2(radioOrbitaEstacionEspacial, 0); ThingEstacionEspacial estacionEspacial = new ThingEstacionEspacial(galaxia, posicionEstacion, tamanioEstacionEspacial); estacionEspacial.EnOrbita = true; estacionEspacial.ThingCentroOrbita = planeta; estacionEspacial.RadioOrbita = radioOrbitaEstacionEspacial; estacionEspacial.VelocidadRotacionOrbita = velocidadRotacionOrbita; } } else if (rndCreacionSectores.Next(0, ProbabilidadEstacionEspacial) == 0) { //Agrego una estación espacial puedeTenerNaves = true; Vector2 posicion = sector.BuscarEspacioVacio(100 + DistanciaMinimaEntreThingsEnSector); ThingEstacionEspacial t = new ThingEstacionEspacial(galaxia, posicion, new Vector2(200, 200)); } else if (rndCreacionSectores.Next(0, ProbabilidadAgujeroDeGusano) == 0) { //Agrego agujeros de gusano float diametro = rndCreacionSectores.Next(100, 500); float velocidadRotacion = rndCreacionSectores.Next(90, 360); //Busco posiciones que sean 2 veces el diametro para que quede espacio alrededor //del agujero de salida para que se mueva el objeto que llegue Vector2 posicion = sector.BuscarEspacioVacio(diametro / 2 + DistanciaMinimaEntreThingsEnSector); ThingAgujeroDeGusano a1 = new ThingAgujeroDeGusano(galaxia, posicion, diametro); Sector sectorDestino; a1.VelocidadRotacion = velocidadRotacion; while (true) { SectorID sectorIDDestino = new SectorID( rndCreacionSectores.Next(-TamanioEnSectores / 2, TamanioEnSectores / 2), rndCreacionSectores.Next(-TamanioEnSectores / 2, TamanioEnSectores / 2)); if (galaxia.SectorCargado(sectorIDDestino) == false) { sectorDestino = galaxia.GetSector(sectorIDDestino); break; } } posicion = sectorDestino.BuscarEspacioVacio(diametro / 2 + DistanciaMinimaEntreThingsEnSector); ThingAgujeroDeGusano a2 = new ThingAgujeroDeGusano(galaxia, posicion, diametro); a1.AgujeroDestino = a2; a2.AgujeroDestino = a1; } if (puedeSerNebula) { int probabilidadNebula = ProbabilidadNebula; //Si un sector tiene una nebula cerca, tiene mas probabilidad de ser nebula foreach (SectorID sIDCercano in sectorID.SectoresCercanos) { if (galaxia.SectorCargado(sIDCercano) && galaxia.GetSector(sIDCercano).TieneNebulosa) { probabilidadNebula = ProbabilidadNebulaContinua; break; } } if (rndCreacionSectores.Next(0, probabilidadNebula) == 0) { sector.CrearNebulosa(); } } if (puedeTenerNaves && sector.Faccion != null) { int cantidadNaves = rndCreacionSectores.Next(0, 2); for (int i = 0; i < cantidadNaves; i++) { Vector2 posicion = sector.BuscarEspacioVacio(300); Things.NPC.ThingNaveNPC thingNaveNPC = new Things.NPC.ThingNaveNPC(galaxia, new Vector2(100, 100), posicion, 0, sector.Faccion); } } return(sector); }
public override void Draw(GUIGraphicEngine guiGraphicEngine) { Thing thingASeguir = Game.GameEngine.Instance.ThingASeguir; if (thingASeguir == null) { return; } Galaxia galaxia = thingASeguir.Galaxia; //Calculo la posición del mapa en la pantalla Vector2 inicioSuperiorIzquierdo = new Vector2(PrvGetAbsolutePosition().X, PrvGetAbsolutePosition().Y); Vector2 finInferiorDerecho = new Vector2(PrvGetAbsolutePosition().X + Size.Width, PrvGetAbsolutePosition().Y + Size.Height); //Calculo la cantidad óptima de sectores de igual tamaño (cuadrados) a dibujar int radioSectoresADibujarEnMapaX = Properties.Settings.Default.RadioSectoresCercanosADibujarEnMapa; int radioSectoresADibujarEnMapaY = Properties.Settings.Default.RadioSectoresCercanosADibujarEnMapa; Vector2 tamanioSectorEnMapa = new Vector2( (finInferiorDerecho.X - inicioSuperiorIzquierdo.X) / (radioSectoresADibujarEnMapaX * 2 + 1), (finInferiorDerecho.Y - inicioSuperiorIzquierdo.Y) / (radioSectoresADibujarEnMapaY * 2 + 1)); float tamanioSectorAUsar; if (tamanioSectorEnMapa.X > tamanioSectorEnMapa.Y) { tamanioSectorAUsar = tamanioSectorEnMapa.X; } else { tamanioSectorAUsar = tamanioSectorEnMapa.Y; } tamanioSectorEnMapa.X = tamanioSectorAUsar; tamanioSectorEnMapa.Y = tamanioSectorAUsar; radioSectoresADibujarEnMapaX = (int)Math.Ceiling((finInferiorDerecho.X - inicioSuperiorIzquierdo.X) / tamanioSectorEnMapa.X / 2 - 1); radioSectoresADibujarEnMapaY = (int)Math.Ceiling((finInferiorDerecho.Y - inicioSuperiorIzquierdo.Y) / tamanioSectorEnMapa.Y / 2 - 1); SectorID sectorIDCentro = galaxia.GetSectorEnPosicion(thingASeguir.Centro).SectorID; Gl.glBegin(Gl.GL_QUADS); //Dibujo un fondo negro GraphicEngine.Instance.SetColor(Color.FromArgb(200, Color.Black)); Gl.glVertex3f(inicioSuperiorIzquierdo.X, inicioSuperiorIzquierdo.Y, GraphicEngine.zValue); Gl.glVertex3f(inicioSuperiorIzquierdo.X, finInferiorDerecho.Y, GraphicEngine.zValue); Gl.glVertex3f(finInferiorDerecho.X, finInferiorDerecho.Y, GraphicEngine.zValue); Gl.glVertex3f(finInferiorDerecho.X, inicioSuperiorIzquierdo.Y, GraphicEngine.zValue); Gl.glEnd(); //Dibujo el borde del mapa Gl.glBegin(Gl.GL_LINE_LOOP); GraphicEngine.Instance.SetColor(Color.FromArgb(100, Color.LightBlue)); Gl.glVertex3f(inicioSuperiorIzquierdo.X, inicioSuperiorIzquierdo.Y, GraphicEngine.zValue); Gl.glVertex3f(inicioSuperiorIzquierdo.X, finInferiorDerecho.Y, GraphicEngine.zValue); Gl.glVertex3f(finInferiorDerecho.X, finInferiorDerecho.Y, GraphicEngine.zValue); Gl.glVertex3f(finInferiorDerecho.X, inicioSuperiorIzquierdo.Y, GraphicEngine.zValue); Gl.glEnd(); //Dibujo las lineas de los sectores y su contenido //Calculo el offset dentro del mapa debido al desplazamiento del jugador en el sector Vector2 offset = new Vector2( (thingASeguir.Centro.X - galaxia.GetSector(sectorIDCentro).Centro.X) / Sector.TamanioSector * tamanioSectorEnMapa.X, (thingASeguir.Centro.Y - galaxia.GetSector(sectorIDCentro).Centro.Y) / Sector.TamanioSector * tamanioSectorEnMapa.Y); //Dibujo un sector menos y un sector mas en cada uno de los ejes (X,Y) para compensar los casos en los que //el offset es distinto a cero, en cuyo caso se deberian ver parcialmente algunos otros sectores Vector2 from = new Vector2( inicioSuperiorIzquierdo.X - offset.X - tamanioSectorEnMapa.X, finInferiorDerecho.Y + offset.Y + tamanioSectorEnMapa.Y); Gl.glBegin(Gl.GL_LINES); for (int x = sectorIDCentro.X - radioSectoresADibujarEnMapaX - 1; x <= sectorIDCentro.X + radioSectoresADibujarEnMapaX + 1; x++) { from.Y = finInferiorDerecho.Y + offset.Y + tamanioSectorEnMapa.Y; GraphicEngine.Instance.SetColor(Color.FromArgb(100, Color.LightBlue)); //Linea vertical que abarca todos los sectores if (Properties.Settings.Default.DibujarLineasMapa) { Gl.glVertex3f(from.X, inicioSuperiorIzquierdo.Y, GraphicEngine.zValue); Gl.glVertex3f(from.X, finInferiorDerecho.Y, GraphicEngine.zValue); } Vector2 to = new Vector2(from.X + tamanioSectorEnMapa.X, from.Y - tamanioSectorEnMapa.Y); for (int y = sectorIDCentro.Y - radioSectoresADibujarEnMapaY - 1; y <= sectorIDCentro.Y + radioSectoresADibujarEnMapaY + 1; y++) { Sector sector = galaxia.GetSector(new SectorID(x, y)); bool cambiarFondo = false; Color nuevoColorFondo = Color.Black; if (sector.TieneNebulosa) { //Relleno el sector de un color distinto si tiene nebulosa cambiarFondo = true; nuevoColorFondo = Color.FromArgb(50, Color.DarkViolet); } if (thingASeguir is ThingNave) { ThingNave thingNave = (ThingNave)thingASeguir; if (sector.Faccion != null && sector.Faccion.GetRelacion(thingNave.Faccion) == Faccion.RelacionConOtraFaccionEnum.Agresiva) { cambiarFondo = true; nuevoColorFondo = Color.FromArgb(50, Color.Red); } } if (cambiarFondo) { Gl.glEnd(); Gl.glBegin(Gl.GL_QUADS); GraphicEngine.Instance.SetColor(nuevoColorFondo); Gl.glVertex3f(from.X, from.Y, GraphicEngine.zValue); Gl.glVertex3f(from.X, to.Y, GraphicEngine.zValue); Gl.glVertex3f(to.X, to.Y, GraphicEngine.zValue); Gl.glVertex3f(to.X, from.Y, GraphicEngine.zValue); Gl.glEnd(); Gl.glBegin(Gl.GL_LINES); } //Dibujo las naves que haya en el sector if (sector.ThingsCount > 0) { Gl.glEnd(); } foreach (Thing thing in sector.Things) { //Dibujo todos los elementos en el mapa, excepto la nave del jugador //que la dibujo al final para que queda arriba de todo if (!(thing is ThingNaveJugador)) { DibujarThing(guiGraphicEngine, thing, sector, from, to, tamanioSectorAUsar); } } if (sector.ThingsCount > 0) { Gl.glBegin(Gl.GL_LINES); } GraphicEngine.Instance.SetColor(Color.FromArgb(100, Color.LightBlue)); //Linea horizontal que abarca solo este sector if (Properties.Settings.Default.DibujarLineasMapa) { Gl.glVertex3f(from.X, to.Y, GraphicEngine.zValue); Gl.glVertex3f(to.X, to.Y, GraphicEngine.zValue); } from.Y -= tamanioSectorEnMapa.Y; to.Y -= tamanioSectorEnMapa.Y; } from.X += tamanioSectorEnMapa.X; } Gl.glEnd(); //Dibujo la nave del jugador en el centro del mapa, lo cual siempre va a ser correcto //porque el mapa esta centrado en el jugador //DibujarThing(guiGraphicEngine, naveJugador, galaxia.GetSectorEnPosicion(naveJugador.Centro), from, to, tamanioSectorAUsar); Vector2 centroMapa = new Vector2( (inicioSuperiorIzquierdo.X + finInferiorDerecho.X) / 2, (inicioSuperiorIzquierdo.Y + finInferiorDerecho.Y) / 2); centroMapa.X -= PrvGetAbsolutePosition().X; centroMapa.Y -= PrvGetAbsolutePosition().Y; thingASeguir.DibujarEnMapa(centroMapa, tamanioSectorAUsar / 3, guiGraphicEngine); }