/// <summary>
        ///   Creates a test section.
        /// </summary>
        /// <param name="owner">The level that will own this section.</param>
        /// <returns>
        ///   A section consisting of randomly placed and sized rows of concrete
        ///   blocks with a TestPlayer.
        /// </returns>
        public static Section GenerateSection(Level owner)
        {
            // Create a section of randomly placed stretches of stone tiles.

            Section result = new Section(owner);

            result.Bounds = new Physics.BoundingRectangle(0, 0, 3200, 1920);
            result.AutoscrollSettings = new Physics.SectionAutoscrollSettings(CameraScrollType.FreelyMoving, Vector2.Zero, null);
            result.Background = GenerateBackground(result);

            Layer mainLayer = new Layer(result, false);
            result.Layers.Add(mainLayer);
            mainLayer.SetMainLayer();

            Random random = new Random();
            float tilePlacerX = 0f;
            float tilePlacerY = 200f;

            // really temporary
            // AssemblyManager.LoadAssembly(System.IO.Path.Combine(System.IO.Directory.GetCurrentDirectory(),
            // "TestPackage", "SmlSample.dll")); hey it actually was temporary
            // TODO: have ContentPackageManager ignore multiple attempts to add
            //       the same package

            Tile testTile3 = AssemblyManager.GetTileByFullName("SmlSample.TestTile3");
            testTile3.GraphicsResourceName = "smw_concrete_block";

            while (tilePlacerX < 1008f)
            {
                int runDistance = random.Next(3, 8);
                tilePlacerY += (random.Next(1, 3) * 16f) * ((random.Next(0, 2) != 0) ? 1 : -1);
                tilePlacerY -= (tilePlacerY % 16);
                tilePlacerY = MathHelper.Clamp(tilePlacerY, 0, 1920);

                for (int i = 0; i < runDistance; i++)
                {
                    Tile newTile = testTile3.Clone();
                    newTile.Position = new Vector2(tilePlacerX, tilePlacerY);
                    result.AddTile(newTile);
                    tilePlacerX += 16f;
                }
            }

            Sprite player = AssemblyManager.GetSpriteByFullName("SmlSample.SimplePlayer");
            player.Position = Vector2.Zero;
            player.IsActive = true;
            player.State = (SpriteState)0;
            player.TileCollisionMode = SpriteCollisionMode.OffsetNotify;
            result.AddSprite(player);

            Sprite painter = AssemblyManager.GetSpriteByFullName("SmlSample.PainterSprite");
            painter.Position = new Vector2(16f, 0f);
            painter.IsActive = true;
            painter.State = (SpriteState)0;
            painter.TileCollisionMode = SpriteCollisionMode.NoCollision;
            result.AddSprite(painter);

            return result;
        }
示例#2
0
        /// <summary>
        ///   Initializes this screen.
        /// </summary>
        /// <param name="owner">The screen that is creating this one.</param>
        /// <param name="parameters">
        ///   Parameters to specify how the screen should be initialized.
        ///   Contains a path to the level file to load.
        /// </param>
        public override void Initialize(Screen owner, string parameters)
        {
            // level = new Level();
            //level.Sections.Add(new Section(level));

            // temporary level.ContentFolderPaths = new List<string>() {
            // System.IO.Directory.GetCurrentDirectory() + @"\TestPackage" };
            level = new IO.LevelSerializers.Serializer003().Deserialize(System.IO.File.ReadAllText(parameters));
            level.Path = parameters;
            level.Initialize();
        }
示例#3
0
		public Level Deserialize(string json)
		{
			JObject obj = null;
			Level result = new Level();

			try
			{
				obj = JObject.Parse(json);
			}
			catch (Exception ex)
			{
				throw new ArgumentException("The deserialization process encountered an error.", ex);
			}

			if ((string)obj["header"]["version"] != SerializerVersion)
			{
				throw new ArgumentException($"This level was created with a different version of the serializer. Expected {SerializerVersion}, got {(string)obj["header"]["version"]}.");
			}

			result.Name = (string)obj["header"]["name"];
			result.Author = (string)obj["header"]["author"];
			result.EventScript.Script = (string)obj["script"];

			JArray contentObjects = (JArray)obj["contentPackages"];
			JArray sectionObjects = (JArray)obj["sections"];
			JArray levelExitObjects = (JArray)obj["levelExits"];

			result.ContentFolderPaths = contentObjects.ToObject<List<string>>();
			Content.ContentPackageManager.AddPackageFromFolder(result.ContentFolderPaths[0]); // TODO: make this not hardcoded

			result.Sections = DeserializeSections(sectionObjects, result);
			result.LevelExits = DeserializeLevelExits(levelExitObjects);

			result.ActiveSection = result.Sections.First(s => s.Index == 0);

			return result;
		}
示例#4
0
		public string Serialize(Level level) => JObject.FromObject(GetSerializableObjects(level)).ToString();
示例#5
0
		internal object GetSerializableObjects(Level level)
		{
			return new
			{
				header = new
				{
					version = SerializerVersion,
					name = level.Name,
					author = level.Author
				},
				contentPackages = level.ContentFolderPaths,
				levelExits = GetLevelExitObjects(level),
				sections = GetSectionObjects(level),
				script = level.EventScript.Script
			};
		}
示例#6
0
		internal object GetSectionObjects(Level level)
		{
			var result = new List<object>(level.Sections.Count);

			foreach (var section in level.Sections)
			{
				result.Add(new
				{
					index = section.Index,
					name = section.Name,
					bounds = section.Bounds.Serialize(),
					scrollSettings = GetAutoscrollSettingsObject(section),
					background = GetBackgroundObject(section),
					layers = GetLayerObjects(section),
					sprites = GetSpriteObjects(section),
					paths = GetPathObjects(section)
				});
			}

			return result;
		}
示例#7
0
		internal object GetLevelExitObjects(Level level)
		{
			var result = new List<object>(level.LevelExits.Count);

			foreach (var levelExit in level.LevelExits)
			{
				result.Add(new
				{
					exitIndex = levelExit.ExitIndex,
					exitDirection = (int)levelExit.ExitDirection,
					objectName = levelExit.ObjectName
				});
			}

			return result;
		}
示例#8
0
		internal List<Section> DeserializeSections(JArray sectionObjects, Level ownerLevel)
		{
			List<Section> result = new List<Section>();

			foreach (var entry in sectionObjects)
			{
				Section section = new Section(ownerLevel);

				section.Index = (int)entry["index"];
				section.Name = (string)entry["name"];
				section.Bounds = BoundingRectangle.FromSimpleString((string)entry["bounds"]);
				section.AutoscrollSettings = DeserializeAutoscrollSettings((JObject)entry["scrollSettings"]);
				section.Background = DeserializeBackground((JObject)entry["background"], section);

				JArray layersData = (JArray)entry["layers"];
				JArray spritesData = (JArray)entry["sprites"];
				JArray pathsData = (JArray)entry["paths"];

				List<Sprite> sectionSprites;
				SparseCellGrid<Sprite> sectionSpriteGrid = DeserializeSprites(spritesData, out sectionSprites);

				section.Layers = DeserializeLayers(layersData, section);
				section.SpritesGrid = sectionSpriteGrid;
				section.Sprites = sectionSprites;
				section.Players.AddRange(section.Sprites.Where(s => s.IsPlayer));
				section.Paths = DeserializePaths(pathsData);

				section.IsLoaded = true;
				result.Add(section);
			}

			return result;
		}