private void WorldGenerator() { //Generating a system stars. Texture2D circle = Content.Load<Texture2D>("LittleStars/CurrentPlayerCircle"); r = new Random(); r2 = new Random(); int objectsCount = r.Next(150, 300); int holesCount = r.Next(5, 15); int holes = 0; double pixelsTemp = 4000 / objectsCount; //Calculating pixels between two stars. int pixels = 0; map = new Map(); Texture2D texture; //int temp = 1; for (int i = 0; i < objectsCount; i++) { //BlackHole or Star bool isBlackHole = false; if (holesCount > holes) { isBlackHole = new Random().Next(0, 2) == 1 ? true : false; } if (isBlackHole) { texture = Content.Load<Texture2D>("BlackHoles/OnMap/" + blackHolesOnMapTextures[r2.Next(0, blackHolesOnMapTextures.Length)]); } else { texture = Content.Load<Texture2D>("LittleStars/SystemStars/" + systemStarsTextures[r2.Next(0, systemStarsTextures.Length)]); } //Checking for range between stars. //First version of algorithm, where stars adding only if have place to it. bool isNear = true; float starX = 0; float starY = 0; if (map.Objects.Count == 0) { starX = r.Next(0, 4000); starY = r.Next(0, 4000); } else { while (isNear) { starX = r.Next(0, 4000); starY = r.Next(0, 4000); isNear = false; foreach (IDraw star in map.Objects) { if (Math.Abs(((IMoveble)star).X - starX) < pixels || Math.Abs(((IMoveble)star).Y - starY) < pixels) { isNear = true; break; } } } } //Adding stars if (isBlackHole) { BlackHoleOnMap tempHole = new BlackHoleOnMap(texture, new Vector2(starX, starY), new Vector2(Scales.FourTenth)); GenerateBlackHoleSystem(tempHole); map.Objects.Add(tempHole); if (pixels == 0) { pixels = (int)tempHole.Width / 2; } holes++; } else { StarOnMap tempStar = new StarOnMap(texture, new Vector2(starX, starY), new Vector2(Scales.FourTenth)); tempStar.Circle = circle; tempStar.Owner = "Unknown"; GenerateSolarSystem(tempStar); map.Objects.Add(tempStar); if (pixels == 0) { pixels = (int)tempStar.Width / 2; } } ((ProgressBar)screens["Gen"].Objects["ProgressBar"]).PWidth = (int)((float)i / objectsCount * ((ProgressBar)screens["Gen"].Objects["ProgressBar"]).TextureWidth); ((GameString)screens["Gen"].Objects["String"]).Str = "Generating stars... " + i.ToString() + "/" + objectsCount; } GalaxyMap(map); currentScreen = "GalaxyMap"; LoadEvents("GalaxyMap"); GC.Collect(); GC.WaitForPendingFinalizers(); }
/// <summary> /// Открытие экрана звездной системы. /// </summary> /// <param name="star">Звезда, к которой привязана звзедная система.</param> private void SolarSystemOpen(StarOnMap star) { /* * Проверки на известность системы, есть ли владелец и все такое. * Так же загрузка координат кораблей относительно звезды. * может еще чего с планетами сделать подобное. * Потому что до первого тика они имеют ебнутые координаты и лишь потом выстраиваются вокруг звезды. * Ну и видимо еще точно так же загрузка астероидов из относительных координат. * Загрузка ивентов звездной системы. */ //Проверка на известность, владельца. SolarSystem(star.SS); bool isUnknown = true; foreach (IDraw obj in star.SS.Objects) { if (obj is Planet) { if (obj.ToPlanet().Owner != "Unknown") { isUnknown = false; break; } } } if (isUnknown) { foreach (IDraw obj in star.SS.Objects) { if (obj is Planet) { obj.ToPlanet().Owner = "Nobody"; } } star.Owner = "Nobody"; star.IsVisited = true; star.Circle = StarOnMapCircles["Nobody"]; } foreach (IDraw obj in star.SS.Objects) { //Загрузка относительных координат кораблей. if (obj is Ship) { if (obj.ToShip().PositionFromCenter != Vector2.Zero) { obj.ToShip().Position = /*HERE*//*Shift(CenterPoint)*/CenterPoint - obj.ToShip().PositionFromCenter; obj.ToShip().NextPosition = CenterPoint - obj.ToShip().NextPosition; } } //Загрузка относительных координат астероидов. else if (obj is Asteroid) { if (obj.ToAsteroid().PositionFromCenter != Vector2.Zero) { obj.ToAsteroid().Position = /*HERE*//*Shift(CenterPoint)*/CenterPoint - obj.ToAsteroid().PositionFromCenter; } } //Загрузка относительных координат планет. else if (obj is Planet) { if (obj.ToPlanet().PositionFromCenter != Vector2.Zero) { obj.ToPlanet().Position = /*HERE*//*Shift(CenterPoint)*/CenterPoint - obj.ToPlanet().PositionFromCenter; } } else if (obj is StationBuilder) { if (obj.ToStationBuilder().PositionFromCenter != Vector2.Zero) { obj.ToStationBuilder().Position = CenterPoint - obj.ToStationBuilder().PositionFromCenter; } } else if (obj is StationOnBuilding) { if (obj.ToStationOnBuilding().PositionFromCenter != Vector2.Zero) { obj.ToStationOnBuilding().Position = CenterPoint - obj.ToStationOnBuilding().PositionFromCenter; obj.ToStationOnBuilding().Progress.Position = new Vector2(obj.ToStationOnBuilding().Position.X, obj.ToStationOnBuilding().Position.Y - obj.ToStationOnBuilding().Progress.Height - 5); } } else if (obj is Station) { if (obj.ToStation().PositionFromCenter != Vector2.Zero) { obj.ToStation().Position = CenterPoint - obj.ToStation().PositionFromCenter; } } } //Загрузка ивентов и установка текущего экрана. LoadEvents("SolarSystem"); currentScreen = "SolarSystem"; }
//-------------------------------------------------------------- //GENERATE SOLAR SYSTEM //-------------------------------------------------------------- private void GenerateSolarSystem(StarOnMap star) { //Construct star name string tempName = ConstructName(); star.Name = tempName; //End name construction //Generating Solar System Random starType = new Random(); string starTextureStr = starsTextures[starType.Next(0, starsTextures.Length)]; Texture2D starTexture = Content.Load<Texture2D> ("Stars/"+starTextureStr); //Here take a starcolor' string color = GetColor(starTextureStr); Star tempStar = new Star(starTexture, CenterPoint, new Vector2(Scales.None), color); //Copy star name to solar star name tempStar.Name = tempName; SolarSystem ss = new SolarSystem(tempStar); ss.BackGround = CreateBackground("SystemBacks/"+ systemBackTextures[new Random().Next(0, systemBackTextures.Length)], Scales.None, 255f); //NEW PLANET GENERATING GeneratingPlanets(ss); //END NEW PLANET GENERATING GeneratingAsteroids(ss); //End generating solar system star.SS = ss; }