Esempio n. 1
0
        /// <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);
                }
            }
        }
Esempio n. 2
0
 /// <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);
     }
 }
Esempio n. 3
0
 /// <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();
 }
Esempio n. 4
0
        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);
        }
Esempio n. 5
0
        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);
        }
Esempio n. 6
0
 /// <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));
 }