Beispiel #1
0
        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);
        }
Beispiel #4
0
        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);
        }
Beispiel #5
0
 public abstract Sector CrearSector(SectorID sectorID);