/// <summary> /// Removes object from the game /// </summary> /// <param name="gameObject"></param> public void Remove(IGameObject gameObject) { if (GameObjects.Contains(gameObject)) { GameObjects.Remove(gameObject); } if (VisibleGameObjects.Contains(gameObject)) { VisibleGameObjects.Remove(gameObject); } if (collidingObjects.ContainsKey(gameObject)) { collidingObjects.Remove(gameObject); } foreach (var go in collidingObjects) { if (go.Value.Contains(gameObject)) { go.Value.Remove(gameObject); } } }
/// <summary> /// Add a new GameObject to the list of objects to be handled. /// </summary> /// <param name="gameObject">The new object to handle.</param> public void AddObject(GameObject gameObject) { if (!GameObjects.Contains(gameObject)) { GameObjects.Add(gameObject); } }
/// <summary> /// Removes GameObjects from the GameObjects List that are stored in the _toRemove List /// </summary> private void RemoveGameObjects() { foreach (GameObject gameObject in _toRemove) { if (GameObjects.Contains(gameObject)) { GameObjects.Remove(gameObject); } } _toRemove.Clear(); }
void addDoorToLevel(Vector2 position) { if (door != null && GameObjects.Contains(door)) { GameObjects.Remove(door); } // Create door door = new Door(eventBus); position.X -= door.CollisionBox.Center.X; position.Y -= door.CollisionBox.Center.Y; door.Props.Position = position; door.Load(_loader); GameObjects.Add(door); chunkMap.UpdateEntity(door); }
void loadMap(string mapPath) { currentMapPath = mapPath; // Variables Jumps.Value = 0; CoinsCount.Value = 0; // Reset game objects GameObjects.RemoveAll(o => o is Coin || o is Platform || o is Door); // Create map tiles var doc = SvgDocument.Open(mapPath); var elements = doc.Children.FindSvgElementsOf <SvgPath>(); // get images var patterns = doc.Children.FindSvgElementsOf <SvgPatternServer>(); var images = new Dictionary <string, Texture2D>(); foreach (var pattern in patterns) { var image = pattern.Children.FindSvgElementsOf <SvgImage>().FirstOrDefault(); if (image == null) { continue; } if (!string.IsNullOrWhiteSpace(image.Href)) { var v = image.Href.ToString() ?? string.Empty; var startIndex = v.IndexOf(',') + 1; var len = v.Length - startIndex; var base64 = v.Substring(startIndex, len).TrimStart(); var texture = convertBase64ToTexure(base64); images.Add(pattern.ID, texture); } } // Load new platforms var platformsToLoad = new List <Platform>(); var maxMapX = 0; var maxMapY = 0; playerStart = new Vector2(0, 0); playerExit = new Vector2(0, 0); foreach (var elem in elements) { // colors var fillColor = elem.Fill?.ToString() ?? "#FF0000"; var strokeColor = elem.Stroke?.ToString(); fillColor = fillColor.TrimStart("url(".ToArray()).TrimEnd(")".ToArray()); if (fillColor == null || !fillColor.StartsWith("#")) { fillColor = "#FF0000"; } if (strokeColor == null || !strokeColor.StartsWith("#")) { strokeColor = null; } var imageKey = fillColor.TrimStart('#'); Texture2D imageData = null; if (images.ContainsKey(imageKey)) { imageData = images[imageKey]; fillColor = "#FF0000"; } // dimensions var x = (int)Math.Round(elem.Bounds.X, 1); var y = (int)Math.Round(elem.Bounds.Y, 1); var w = (int)Math.Round(elem.Bounds.Width, 1); var h = (int)Math.Round(elem.Bounds.Height, 1); // create poly var vertexes = elem.PathData.Select(d => new Vector2(d.Start.X, d.Start.Y)) .Union(elem.PathData.Select(d => new Vector2(d.End.X, d.End.Y))) .Distinct().ToArray(); Debug.WriteLine($"[shape]"); Debug.WriteLine($"size: {x} {y} - {w} x {h}"); Debug.WriteLine($"verts: {vertexes.Length}"); if (fillColor == "#000001") { playerStart.X = x; playerStart.Y = y; } else if (fillColor == "#000002") { // Door playerExit.X = x; playerExit.Y = y; } else { // Platform var platform = new Platform(fillColor, strokeColor, vertexes, imageData); platform.Load(_loader); platformsToLoad.Add(platform); } maxMapX = Math.Max(maxMapX, x + w); maxMapY = Math.Max(maxMapY, y + h); } Debug.WriteLine($"Map size in px: {maxMapX} x {maxMapY}"); // setup chunks chunkMap.Reset(chunkWidth: 100, chunkHeight: 100, mapWidth: maxMapX, mapHeight: maxMapY); // physics reset var phys = new MapPhysics(chunkMap, physSettings); foreach (var platform in platformsToLoad) { if (!GameObjects.Contains(platform)) { GameObjects.Add(platform); } chunkMap.UpdateEntity(platform); } // Verify that the level has a beginning and an end. if (playerStart == Vector2.Zero) { throw new NotSupportedException("A level must have a starting point."); } if (playerExit == Vector2.Zero) { throw new NotSupportedException("A level must have an exit."); } // Set player position for new map player.Props.Position = playerStart; addCoinToLevel(new Vector2(300, 0)); // Add end point addDoorToLevel(playerExit); }
/// <summary> /// Returns true if and only if the given GameObject exists in this Shard. /// </summary> /// <param name="gameObject">GameObject to test</param> /// <returns>as described</returns> public bool Exists(GameObject gameObject) { return(GameObjects.Contains(gameObject) || Units.Contains(gameObject) || Characters.Contains(gameObject)); }