상속: IElement
예제 #1
0
        public void CreateTileArray(TmxLayer levelLayer)
        {
            Tile[,] tiles = new Tile[TileMap.RowCount, TileMap.ColumnCount];
            for (var i = 0; i < levelLayer.Tiles.Count; i++)
            {
                //our value
                int gid = levelLayer.Tiles[i].Gid;
                if (gid != 0)
                {
                    gid--;
                    SpriteHolder spriteHolder = SpritePositions[gid];
                    //we are a ground type else solid
                    if (gid == 434)
                    {
                        tiles[levelLayer.Tiles[i].X, levelLayer.Tiles[i].Y] = new Tile("", levelLayer.Tiles[i].X, levelLayer.Tiles[i].Y, TileMap.TileSize, TileMap.TileSize, new Rectangle(spriteHolder.origin.ToPoint().X, spriteHolder.origin.ToPoint().Y, TileMap.TileSize, TileMap.TileSize), TileType.Ground);
     
                    }
                    else
                    {
                        tiles[levelLayer.Tiles[i].X, levelLayer.Tiles[i].Y] = new Tile("", levelLayer.Tiles[i].X, levelLayer.Tiles[i].Y, TileMap.TileSize, TileMap.TileSize, new Rectangle(spriteHolder.origin.ToPoint().X, spriteHolder.origin.ToPoint().Y, TileMap.TileSize, TileMap.TileSize), TileType.Solid);
                    }                    
                }
                else
                {
                    SpriteHolder spriteHolder = SpritePositions[301];
                    int size = random.Next(0, 5);
                    tiles[levelLayer.Tiles[i].X, levelLayer.Tiles[i].Y] = new Tile("", levelLayer.Tiles[i].X, levelLayer.Tiles[i].Y, TileMap.TileSize, TileMap.TileSize, new Rectangle(spriteHolder.origin.ToPoint().X, spriteHolder.origin.ToPoint().Y, size, size), TileType.Solid);
                }
            }

            TileMap.Map = tiles;
            TileMap.aStar = new AStarSolver<Tile, Object>(TileMap.Map);
        }
예제 #2
0
        public TmxGroup(XElement xGroup, int width, int height, string tmxDirectory)
        {
            Name    = (string)xGroup.Attribute("name") ?? String.Empty;
            Opacity = (double?)xGroup.Attribute("opacity") ?? 1.0;
            Visible = (bool?)xGroup.Attribute("visible") ?? true;
            OffsetX = (double?)xGroup.Attribute("offsetx") ?? 0.0;
            OffsetY = (double?)xGroup.Attribute("offsety") ?? 0.0;

            Properties = new PropertyDict(xGroup.Element("properties"));

            Layers       = new TmxList <ITmxLayer>();
            TileLayers   = new TmxList <TmxLayer>();
            ObjectGroups = new TmxList <TmxObjectGroup>();
            ImageLayers  = new TmxList <TmxImageLayer>();
            Groups       = new TmxList <TmxGroup>();
            foreach (var e in xGroup.Elements().Where(x => x.Name == "layer" || x.Name == "objectgroup" || x.Name == "imagelayer" || x.Name == "group"))
            {
                ITmxLayer layer;
                switch (e.Name.LocalName)
                {
                case "layer":
                    var tileLayer = new TmxLayer(e, width, height);
                    layer = tileLayer;
                    TileLayers.Add(tileLayer);
                    break;

                case "objectgroup":
                    var objectgroup = new TmxObjectGroup(e);
                    layer = objectgroup;
                    ObjectGroups.Add(objectgroup);
                    break;

                case "imagelayer":
                    var imagelayer = new TmxImageLayer(e, tmxDirectory);
                    layer = imagelayer;
                    ImageLayers.Add(imagelayer);
                    break;

                case "group":
                    var group = new TmxGroup(e, width, height, tmxDirectory);
                    layer = group;
                    Groups.Add(group);
                    break;

                default:
                    throw new InvalidOperationException();
                }
                Layers.Add(layer);
            }
        }
예제 #3
0
        private static Tile LoadTile(TmxLayer tmxLayer, TmxLayerTile tmxTile, Tileset[] tilesets, ContentManager content, GraphicsDevice graphicsDevice)
        {
            Tile tile = null;

            if (tmxTile.Gid != 0)
            {
                // Try and find the tileset.
                foreach (var tileset in tilesets)
                {
                    if (tmxTile.Gid >= tileset.FirstGid && tmxTile.Gid <= tileset.LastGid)
                    {
                        int srcY = (((tmxTile.Gid - tileset.FirstGid) / tileset.TilesPerRow) * 32);
                        int srcX = (((tmxTile.Gid - tileset.FirstGid) % tileset.TilesPerRow) * 32);

                        tile = new Tile(tileset, new Rectangle(srcX, srcY, tileset.TileWidth, tileset.TileHeight), new Vector2(tmxTile.X * 32, tmxTile.Y * 32), tmxLayer.Opacity);

                        break;
                    }
                }
            }

            return tile ?? new Tile(null, new Rectangle(), Vector2.Zero, tmxLayer.Opacity);
        }
예제 #4
0
 /// <summary>
 /// Initializes a new instance of the <see cref="TiledMapLayer" /> class.
 /// </summary>
 /// <param name="tmxLayer">The tmx parsed layer.</param>
 public TiledMapLayer(TmxLayer tmxLayer)
 {
     this.tmxLayer = tmxLayer;
     this.tiles = new List<LayerTile>();
     this.NeedRefresh = true;
 }
예제 #5
0
        private void Load(XDocument xDoc)
        {
            var xMap = xDoc.Element("map");

            Version      = (string)xMap.Attribute("version");
            TiledVersion = (string)xMap.Attribute("tiledversion");

            Width         = (int)xMap.Attribute("width");
            Height        = (int)xMap.Attribute("height");
            TileWidth     = (int)xMap.Attribute("tilewidth");
            TileHeight    = (int)xMap.Attribute("tileheight");
            HexSideLength = (int?)xMap.Attribute("hexsidelength");

            // Map orientation type
            var orientDict = new Dictionary <string, OrientationType> {
                { "unknown", OrientationType.Unknown },
                { "orthogonal", OrientationType.Orthogonal },
                { "isometric", OrientationType.Isometric },
                { "staggered", OrientationType.Staggered },
                { "hexagonal", OrientationType.Hexagonal },
            };

            var orientValue = (string)xMap.Attribute("orientation");

            if (orientValue != null)
            {
                Orientation = orientDict[orientValue];
            }

            // Hexagonal stagger axis
            var staggerAxisDict = new Dictionary <string, StaggerAxisType> {
                { "x", StaggerAxisType.X },
                { "y", StaggerAxisType.Y },
            };

            var staggerAxisValue = (string)xMap.Attribute("staggeraxis");

            if (staggerAxisValue != null)
            {
                StaggerAxis = staggerAxisDict[staggerAxisValue];
            }

            // Hexagonal stagger index
            var staggerIndexDict = new Dictionary <string, StaggerIndexType> {
                { "odd", StaggerIndexType.Odd },
                { "even", StaggerIndexType.Even },
            };

            var staggerIndexValue = (string)xMap.Attribute("staggerindex");

            if (staggerIndexValue != null)
            {
                StaggerIndex = staggerIndexDict[staggerIndexValue];
            }

            // Tile render order
            var renderDict = new Dictionary <string, RenderOrderType> {
                { "right-down", RenderOrderType.RightDown },
                { "right-up", RenderOrderType.RightUp },
                { "left-down", RenderOrderType.LeftDown },
                { "left-up", RenderOrderType.LeftUp }
            };

            var renderValue = (string)xMap.Attribute("renderorder");

            if (renderValue != null)
            {
                RenderOrder = renderDict[renderValue];
            }

            NextObjectID    = (int?)xMap.Attribute("nextobjectid");
            BackgroundColor = new TmxColor(xMap.Attribute("backgroundcolor"));

            Properties = new PropertyDict(xMap.Element("properties"));

            Tilesets = new TmxList <TmxTileset>();
            foreach (var e in xMap.Elements("tileset"))
            {
                Tilesets.Add(new TmxTileset(e, TmxDirectory, CustomLoader));
            }

            Layers       = new TmxList <ITmxLayer>();
            TileLayers   = new TmxList <TmxLayer>();
            ObjectGroups = new TmxList <TmxObjectGroup>();
            ImageLayers  = new TmxList <TmxImageLayer>();
            Groups       = new TmxList <TmxGroup>();
            foreach (var e in xMap.Elements().Where(x => x.Name == "layer" || x.Name == "objectgroup" || x.Name == "imagelayer" || x.Name == "group"))
            {
                ITmxLayer layer;
                switch (e.Name.LocalName)
                {
                case "layer":
                    var tileLayer = new TmxLayer(e, Width, Height);
                    layer = tileLayer;
                    TileLayers.Add(tileLayer);
                    break;

                case "objectgroup":
                    var objectgroup = new TmxObjectGroup(e);
                    layer = objectgroup;
                    ObjectGroups.Add(objectgroup);
                    break;

                case "imagelayer":
                    var imagelayer = new TmxImageLayer(e, TmxDirectory);
                    layer = imagelayer;
                    ImageLayers.Add(imagelayer);
                    break;

                case "group":
                    var group = new TmxGroup(e, Width, Height, TmxDirectory);
                    layer = group;
                    Groups.Add(group);
                    break;

                default:
                    throw new InvalidOperationException();
                }
                Layers.Add(layer);
            }
        }
예제 #6
0
파일: Map.cs 프로젝트: cedwards145/ld33
        private void generateTiles()
        {
            tiles = new Dictionary<Tuple<int, int>, Tile>();

            // Create tile objects
            bool passLayer = map.Layers.Contains("pass");

            if (passLayer)
            {
                passabilityLayer = map.Layers["pass"];
                Tile tile;
                for (int index = 0; index < passabilityLayer.Tiles.Count; index++)
                {
                    int x = index % width;
                    int y = index / width;

                    tile = new Tile(new Point(x, y), (passabilityLayer.Tiles[index].Gid == 0));
                    tiles[new Tuple<int, int>(x, y)] = tile;
                }

                foreach (Tuple<int, int> key in tiles.Keys)
                {
                    generateNeighbours(key.Item1, key.Item2);
                }
            }
            else
            {
                for (int x = 0; x < width; x++)
                    for (int y = 0; y < height; y++)
                        tiles[new Tuple<int, int>(x, y)] = new Tile(new Point(x, y), true);
            }
        }
예제 #7
0
        private void DrawMapLayer(TmxLayer layer)
        {
            TmxMap map = currentMap.TmxMap;
            int size = Global.TileSize;

            for (var i = 0; i < layer.Tiles.Count; i++)
            {
                int gid = layer.Tiles[i].Gid;
                if (gid != 0)
                {
                    Tileset tileset = currentMap.GetTileset(gid);

                    int tileFrame = gid - tileset.FirstGid;
                    int column = tileFrame % tileset.TilesWide;
                    int row = tileFrame / tileset.TilesWide;

                    float x = (i % map.Width) * map.TileWidth;
                    float y = (float)Math.Floor(i / (double)map.Width) * map.TileHeight;

                    Rectangle tilesetRec = new Rectangle(size * column, size * row, size, size);
                    spriteBatch.Draw(tileset.Texture, new Rectangle((int)x, (int)y, size, size), tilesetRec, Color.White);
                }
            }
        }
예제 #8
0
        /// <summary>
        /// Unload layer
        /// </summary>
        private void UnloadLayer()
        {
            this.tiledMap = null;
            this.tileTable = null;
            this.tiles = null;
            this.tmxLayer = null;

            this.isLayerLoaded = false;
        }
예제 #9
0
        /// <summary>
        /// Initialize Layer
        /// </summary>
        private void LoadLayer()
        {
            this.tiles = new List<LayerTile>();

            if(this.Owner.Parent == null)
            {
                return;
            }

            this.tiledMap = this.Owner.Parent.FindComponent<TiledMap>();

            if (this.tiledMap != null && this.tiledMap.TmxMap != null)
            {
                this.tmxLayer = this.tiledMap.TmxMap.Layers.FirstOrDefault(l => l.Name == this.tmxLayerName);

                if (this.tmxLayer != null)
                {
                    this.tileTable = new LayerTile[this.tiledMap.Width, this.tiledMap.Height];

                    for (int i = 0; i < this.tmxLayer.Tiles.Count; i++)
                    {
                        var tmxTile = this.tmxLayer.Tiles[i];

                        Tileset selectedTileset = null;

                        if (tmxTile.Gid > 0)
                        {
                            foreach (var tileset in this.tiledMap.Tilesets)
                            {
                                if (tmxTile.Gid <= tileset.LastGid)
                                {
                                    selectedTileset = tileset;
                                    break;
                                }
                            }
                        }

                        LayerTile tile = new LayerTile(tmxTile, selectedTileset);
                        this.tiles.Add(tile);

                        Vector2 tileLocalPosition;
                        this.tiledMap.GetTilePosition(tile.X, tile.Y, selectedTileset, out tileLocalPosition);
                        tile.LocalPosition = tileLocalPosition;

                        int x = i % this.tiledMap.Width;
                        int y = i / this.tiledMap.Width;
                        this.tileTable[x, y] = tile;
                    }

                    this.isLayerLoaded = true;
                    this.NeedRefresh = true;
                }
            }
        }
예제 #10
0
        /// <summary>
        /// Create the tile layer as a child entity
        /// </summary>
        /// <param name="tmxLayer">the tmx parsed layer.</param>
        private void CreateChildTileLayer(TmxLayer tmxLayer)
        {
            var tileMapLayer = new TiledMapLayer(tmxLayer);
            this.tileLayers.Add(tmxLayer.Name, tileMapLayer);

            Entity layerEntity = new Entity(tmxLayer.Name)
            {
                IsVisible = tmxLayer.Visible
            }
            .AddComponent(new Transform2D()
            {
                Opacity = (float)tmxLayer.Opacity
            })
            .AddComponent(tileMapLayer)
            .AddComponent(new TiledMapLayerRenderer(this.layerType, this.samplerMode));

            this.Owner.AddChild(layerEntity);
        }
예제 #11
0
        /// <summary>
        /// Create the tile layer as a child entity
        /// </summary>
        /// <param name="tmxLayer">The tmx layer.</param>
        /// <param name="layerIndex">The layer index</param>
        private void CreateChildTileLayer(TmxLayer tmxLayer, int layerIndex)
        {
            var tag = "TileLayer_" + layerIndex;
            var tmxLayerName = tmxLayer.Name;

            Entity layerEntity = null;
            TiledMapLayer tileMapLayer = null;
            layerEntity = this.Owner.FindChildrenByTag(tag).FirstOrDefault();
            var tileLayerOffset = new Vector2((float)tmxLayer.OffsetX, (float)tmxLayer.OffsetY);

            if (layerEntity != null)
            {
                var tileMapTransform = layerEntity.FindComponent<Transform2D>();
                tileMapLayer = layerEntity.FindComponent<TiledMapLayer>();

                if (tileMapTransform != null
                 && tileMapLayer != null)
                {
                    tileMapTransform.LocalPosition = tileLayerOffset;
                    tileMapLayer.TmxLayerName = tmxLayerName;
                    layerEntity.Name = tmxLayerName;
                }
                else
                {
                    this.Owner.RemoveChild(layerEntity.Name);
                    layerEntity = null;
                }
            }

            if (layerEntity == null)
            {
                tileMapLayer = new TiledMapLayer()
                {
                    TmxLayerName = tmxLayerName
                };

                layerEntity = new Entity(tmxLayerName)
                {
                    Tag = tag
                }
                    .AddComponent(tileMapLayer)
                    .AddComponent(new Transform2D()
                    {
                        LocalPosition = tileLayerOffset,
                        Origin = this.transform.Origin,
                        Opacity = (float)tmxLayer.Opacity
                    })
                    .AddComponent(new TiledMapLayerRenderer());
                this.Owner.AddChild(layerEntity);
            }

            this.tileLayers.Add(tmxLayerName, tileMapLayer);
        }