public ITileMapPlaceable CreateEntity(TileMapObject tileMapObj)
        {
            if (tileMapObj is null)
            {
                throw new ArgumentNullException(nameof(tileMapObj));
            }

            bool success = tileMapObj.CustomProperties.TryGetValue("ClassName", out string className);

            if (!success)
            {
                throw new TileMapObjectCreationException(tileMapObj, CLASS_NAME_PROP_MISSING_ERR_MSG);
            }

            ITileMapPlaceable entity = null;

            try
            {
                entity = (ITileMapPlaceable)Activator.CreateInstance(Type.GetType(className));
                Vector2 position = new Vector2(tileMapObj.X, tileMapObj.Y);
                entity.Initialize(_gameServices, _content, tileMapObj.CustomProperties, position);
            }
            catch (Exception ex)
            {
                throw new TileMapObjectCreationException(tileMapObj, "An error occurred while instantiating the object.", ex);
            }

            return(entity);
        }
예제 #2
0
        protected virtual void ProcessTileMap()
        {
            if (TileMap == null)
            {
                return;
            }

            int renderLayer = (int)RenderLayer.One;

            foreach (var tileLayer in TileMap.Layers.OfType <TileMapTileLayer>())
            {
                TileMapLayerRenderer renderer = new TileMapLayerRenderer(tileLayer);
                renderer.RenderLayer = (RenderLayer)renderLayer;

                EntityManager.AddEntity(renderer);
                renderLayer++;
            }

            foreach (var tileMapObjLayer in TileMap.Layers.OfType <TileMapObjectLayer>())
            {
                foreach (var tileMapObj in
                         tileMapObjLayer.Objects
                         .Where(o => o.ObjectType == TileMapObjectType.Point && o.Type == OBJECT_TYPE_GAME_ENTITY))
                {
                    ITileMapPlaceable placeableObj = _tileMapEntitiyFactory.CreateEntity(tileMapObj);

                    EntityManager.AddEntity(placeableObj);
                }

                foreach (var tileMapObj in tileMapObjLayer.Objects
                         .Where(o => (o.ObjectType == TileMapObjectType.Polygon || o.ObjectType == TileMapObjectType.Rectangle) && o.Type == OBJECT_TYPE_COLLIDER))
                {
                    TileMapCollisionObject collisionObject = new TileMapCollisionObject(tileMapObj, _debugTexture);
                    Collider collider = null;

                    if (tileMapObj.ObjectType == TileMapObjectType.Polygon)
                    {
                        collider = _gameServices.GetService <IPhysicsManager>()?.CreatePolygonCollider(collisionObject, ((TileMapPolygonObject)tileMapObj).Vertices, 0);
                    }
                    else
                    {
                        collider = _gameServices.GetService <IPhysicsManager>()?.CreateRectCollider(collisionObject, ((TileMapRectangleObject)tileMapObj).Size, false);
                    }

                    collisionObject.Collider = collider;
                    this.EntityManager.AddEntity(collisionObject);
                }
            }
        }