예제 #1
0
        CCTileMapLayer(CCTileSetInfo tileSetInfo, CCTileLayerInfo layerInfo, CCTileMapInfo mapInfo, CCTileMapCoordinates layerSize,
                       int totalNumberOfTiles, int tileCapacity, CCTexture2D texture)
        {
            if (texture.ContentSizeInPixels == CCSize.Zero)
            {
                CCLog.Log("Tilemap Layer Texture {0} not loaded for layer {1}", tileSetInfo.TilesheetFilename, layerInfo.Name);
            }

            LayerName       = layerInfo.Name;
            LayerSize       = layerSize;
            Opacity         = layerInfo.Opacity;
            LayerProperties = new Dictionary <string, string>(layerInfo.Properties);

            MapType       = mapInfo.MapType;
            TileTexelSize = mapInfo.TileTexelSize;
            TileSetInfo   = tileSetInfo;

            Position    = LayerOffset(layerInfo.TileCoordOffset);
            ContentSize = LayerSize.Size * TileTexelSize * CCTileMapLayer.DefaultTexelToContentSizeRatios;

            tileSetTexture       = texture;
            tileGIDAndFlagsArray = layerInfo.TileGIDAndFlags;

            TileSetInfo.TilesheetSize = tileSetTexture.ContentSizeInPixels;

            UpdateTileCoordsToNodeTransform();

            ParseInternalProperties();

            InitialiseDrawBuffers();
        }
예제 #2
0
        CCTileSetInfo TilesetForLayer(CCTileLayerInfo layerInfo)
        {
            CCTileMapCoordinates size     = layerInfo.LayerDimensions;
            List <CCTileSetInfo> tilesets = MapInfo.Tilesets;
            int numOfTiles = size.Row * size.Column;

            if (tilesets != null)
            {
                for (int tilesetIdx = 0; tilesetIdx < tilesets.Count; tilesetIdx++)
                {
                    CCTileSetInfo tileset        = tilesets[tilesetIdx];
                    short         tilesetLastGid = (short)(tilesetIdx < tilesets.Count - 1 ? tilesets[tilesetIdx + 1].FirstGid - 1 : short.MaxValue);
                    for (uint tileIdx = 0; tileIdx < numOfTiles; tileIdx++)
                    {
                        CCTileGidAndFlags gidAndFlags = layerInfo.TileGIDAndFlags[tileIdx];

                        if (gidAndFlags.Gid != 0 && gidAndFlags.Gid >= tileset.FirstGid && gidAndFlags.Gid <= tilesetLastGid)
                        {
                            return(tileset);
                        }
                    }
                }
            }

            CCLog.Log("CocosSharp: Warning: CCTileMapLayer: TileMap layer '{0}' has no tiles", layerInfo.Name);
            return(null);
        }
예제 #3
0
        void ParseTileElement()
        {
            if (currentParentElement == CCTileMapProperty.Layer)
            {
                int             layersCount = Layers != null ? Layers.Count : 0;
                CCTileLayerInfo layer       = layersCount > 0 ? Layers[layersCount - 1] : null;

                uint gidAndFlags = uint.Parse(currentAttributeDict[TileElementGidAndFlags]);

                if (currentXmlTileIndex < layer.NumberOfTiles)
                {
                    layer.TileGIDAndFlags[currentXmlTileIndex++] = CCTileMapFileEncodedTileFlags.DecodeGidAndFlags(gidAndFlags);
                }
            }
            else
            {
                int           tilesetCount = Tilesets != null ? Tilesets.Count : 0;
                CCTileSetInfo info         = tilesetCount > 0 ? Tilesets[tilesetCount - 1] : null;

                var dict = new Dictionary <string, string>();

                ParentGID = (short)(info.FirstGid + short.Parse(currentAttributeDict[TileElementId]));
                TileProperties.Add(ParentGID, dict);
                currentParentElement = CCTileMapProperty.Tile;
            }
        }
예제 #4
0
        void ParseTilesetElement()
        {
            string externalTilesetFilename = null;

            // Tileset source
            if (currentAttributeDict.TryGetValue(TilesetElementFileSource, out externalTilesetFilename))
            {
                externalTilesetFilename = CCFileUtils.FullPathFromRelativeFile(externalTilesetFilename,
                                                                               TileMapFileName);

                currentFirstGID = short.Parse(currentAttributeDict[TilesetElementFirstGid]);

                ParseXmlFile(externalTilesetFilename);
            }
            else
            {
                var tileset = new CCTileSetInfo();

                tileset.Name = currentAttributeDict[TilesetElementName];

                // First GID
                if (currentFirstGID == 0)
                {
                    tileset.FirstGid = short.Parse(currentAttributeDict[TilesetElementFirstGid]);
                }
                else
                {
                    tileset.FirstGid = currentFirstGID;
                    currentFirstGID  = 0;
                }

                string tileSpacingStr = null;
                string borderSizeStr  = null;

                // Tilesheet tile spacing
                if (currentAttributeDict.TryGetValue(TilesetElementTileSpacing, out tileSpacingStr))
                {
                    tileset.TileSpacing = int.Parse(tileSpacingStr);
                }

                // Tilesheet border width
                if (currentAttributeDict.TryGetValue(TilesetElementBorderSize, out borderSizeStr))
                {
                    tileset.BorderWidth = int.Parse(borderSizeStr);
                }

                // Tile texel size
                CCSize tileTexelSize;
                tileTexelSize.Width   = CCUtils.CCParseFloat(currentAttributeDict[TilesetElementTexelWidth]);
                tileTexelSize.Height  = CCUtils.CCParseFloat(currentAttributeDict[TilesetElementTexelHeight]);
                tileset.TileTexelSize = tileTexelSize;

                Tilesets.Add(tileset);
            }
        }
예제 #5
0
        CCTileMapDrawBufferManager InitialiseDrawBuffer(CCTileSetInfo tileSetInfo)
        {
            CCTileMapDrawBufferManager drawBufferManager = new CCTileMapDrawBufferManager(LayerSize.Row, LayerSize.Column, this, tileSetInfo);

            for (int y = 0; y < LayerSize.Row; y++)
            {
                for (int x = 0; x < LayerSize.Column; x++)
                {
                    UpdateQuadAt(drawBufferManager, x, y, false);
                }
            }
            drawBufferManager.UpdateQuadBuffers();
            return(drawBufferManager);
        }
예제 #6
0
        void ParseTileAnimationKeyFrameElement()
        {
            if (currentParentElement == CCTileMapProperty.TileAnimation && currentTileAnimationKeyFrames != null)
            {
                int           tilesetCount = Tilesets != null ? Tilesets.Count : 0;
                CCTileSetInfo info         = tilesetCount > 0 ? Tilesets[tilesetCount - 1] : null;

                short frameGid      = (short)(info.FirstGid + short.Parse(currentAttributeDict[TileAnimKeyFrameGid]));
                short frameDuration = short.Parse(currentAttributeDict [TileAnimKeyFrameDuration]);

                if (frameGid >= 0 && frameDuration > 0)
                {
                    currentTileAnimationKeyFrames.Add(new CCTileAnimationKeyFrame(frameGid, frameDuration));
                }
            }
        }
예제 #7
0
            public CCTileMapDrawBufferManager(int mapCols, int mapRows, CCTileMapLayer tileMapLayer, CCTileSetInfo tileSetInfo)
            {
                Buffers      = new List <CCTileMapVertAndIndexBuffer>();
                TileSetInfo  = tileSetInfo;
                TileMapLayer = tileMapLayer;

                // Create the appropriate number of buffers to hold the map.
                int numOfTiles     = mapCols * mapRows;
                int tilesProcessed = 0;

                while (tilesProcessed < numOfTiles)
                {
                    int tilesLeft         = numOfTiles - tilesProcessed;
                    int tilesInThisBuffer = Math.Min(tilesLeft, MaxTilesPerDrawBuffer);

                    CreateDrawBuffer(tilesInThisBuffer, tilesProcessed);

                    tilesProcessed += tilesInThisBuffer;
                }
            }
예제 #8
0
        CCTileSetInfo[] TilesetForLayer(CCTileLayerInfo layerInfo)
        {
            CCTileMapCoordinates size     = layerInfo.LayerDimensions;
            List <CCTileSetInfo> tilesets = MapInfo.Tilesets;
            List <CCTileSetInfo> results  = new List <CCTileSetInfo>();
            int numOfTiles = size.Row * size.Column;

            if (tilesets != null)
            {
                for (int tilesetIdx = 0; tilesetIdx < tilesets.Count; tilesetIdx++)
                {
                    CCTileSetInfo tileset        = tilesets[tilesetIdx];
                    bool          contains       = false;
                    short         tilesetLastGid = (short)(tilesetIdx < tilesets.Count - 1 ? tilesets[tilesetIdx + 1].FirstGid - 1 : short.MaxValue);
                    for (uint tileIdx = 0; tileIdx < numOfTiles; tileIdx++)
                    {
                        CCTileGidAndFlags gidAndFlags = layerInfo.TileGIDAndFlags[tileIdx];
                        if (gidAndFlags.Gid != 0 && gidAndFlags.Gid >= tileset.FirstGid && gidAndFlags.Gid <= tilesetLastGid)
                        {
                            //return tileset;
                            results.Add(tileset);
                            contains = true;
                            break;
                        }
                    }
                    if (contains)
                    {
                        continue;
                    }
                }
            }
            if (results.Count > 0)
            {
                return(results.ToArray());
            }
            else
            {
                CCLog.Log("CocosSharp: Warning: CCTileMapLayer: TileMap layer '{0}' has no tiles", layerInfo.Name);
                return(null);
            }
        }
예제 #9
0
        void ParseImageElement()
        {
            List <CCTileSetInfo> tilesets = Tilesets;
            int           tilesetCount    = tilesets != null ? tilesets.Count : 0;
            CCTileSetInfo tileset         = tilesetCount > 0 ? tilesets[tilesetCount - 1] : null;

            string imagename = currentAttributeDict[ImageElementTilesheetName];

            tileset.TilesheetFilename = imagename;

            var directory = string.Empty;

            if (string.IsNullOrEmpty(TileMapFileName))
            {
                tileset.TilesheetFilename = imagename;
            }
            else
            {
                tileset.TilesheetFilename = CCFileUtils.FullPathFromRelativeFile(imagename, TileMapFileName);
            }
        }
예제 #10
0
        public CCTileMap(CCTileMapInfo mapInfo)
            : base(CCCameraProjection.Projection2D)
        {
            Type          = mapInfo.MapType;
            MapDimensions = mapInfo.MapDimensions;
            MapInfo       = mapInfo;
            TileTexelSize = mapInfo.TileTexelSize;

            ObjectGroups   = mapInfo.ObjectGroups;
            MapProperties  = mapInfo.MapProperties;
            TileProperties = mapInfo.TileProperties;

            TileLayersContainer
                = new CCNode(MapDimensions.Size * TileTexelSize * CCTileMapLayer.DefaultTexelToContentSizeRatios);

            AddChild(TileLayersContainer);

            int idx = 0;

            List <CCTileLayerInfo> layers = mapInfo.Layers;

            if (layers != null)
            {
                foreach (CCTileLayerInfo layerInfo in layers)
                {
                    if (layerInfo.Visible)
                    {
                        CCTileSetInfo  tileset = TilesetForLayer(layerInfo);
                        CCTileMapLayer child   = new CCTileMapLayer(tileset, layerInfo, mapInfo);
                        TileLayersContainer.AddChild(child, idx, idx);

                        idx++;
                    }
                }
            }
        }
예제 #11
0
        // Private constructor chaining

        CCTileMapLayer(CCTileSetInfo tileSetInfo, CCTileLayerInfo layerInfo, CCTileMapInfo mapInfo, CCTileMapCoordinates layerSize) 
            : this(tileSetInfo, layerInfo, mapInfo, layerSize, (int)(layerSize.Row * layerSize.Column))
        {
        }
예제 #12
0
 public CCTileMapLayer(CCTileSetInfo tileSetInfo, CCTileLayerInfo layerInfo, CCTileMapInfo mapInfo)
     : this(tileSetInfo, layerInfo, mapInfo, layerInfo.LayerDimensions)
 {
 }
예제 #13
0
        CCTileMapLayer(CCTileSetInfo[] tileSetInfos, CCTileLayerInfo layerInfo, CCTileMapInfo mapInfo, CCTileMapCoordinates layerSize,
            int totalNumberOfTiles, int tileCapacity)
        {
            tileRenderCommand = new CCCustomCommand(RenderTileMapLayer);

            this.mapInfo = mapInfo;
            LayerName = layerInfo.Name;
            LayerSize = layerSize;
            Opacity = layerInfo.Opacity;
            LayerProperties = new Dictionary<string, string>(layerInfo.Properties);

            TileCoordOffset = new CCTileMapCoordinates(layerInfo.TileCoordOffset);
            ContentSize = LayerSize.Size * TileTexelSize * CCTileMapLayer.DefaultTexelToContentSizeRatios;

            TileGIDAndFlagsArray = layerInfo.TileGIDAndFlags;

            UpdateTileCoordsToNodeTransform();

            ParseInternalProperties();

            InitialiseTileAnimations();

            InitialiseDrawBuffers(tileSetInfos);

            GenerateMinVertexZ();
        }
예제 #14
0
        public CCSprite ExtractTile(int column, int row, bool addToTileMapLayer = true)
        {
            if (!AreValidTileCoordinates(column, row))
            {
                return(null);
            }

            CCTileGidAndFlags gidAndFlags = TileGIDAndFlags(column, row);
            int flattendedIndex           = FlattenedTileIndex(column, row);

            CCTileSetInfo tileSetInfo = GetDrawBufferManagerByGid(gidAndFlags.Gid).TileSetInfo;
            CCRect        texRect     = tileSetInfo.TextureRectForGID(gidAndFlags.Gid);
            CCSprite      tileSprite  = new CCSprite(tileSetInfo.Texture, texRect);

            tileSprite.ContentSize = texRect.Size * CCTileMapLayer.DefaultTexelToContentSizeRatios;
            tileSprite.Position    = TilePosition(column, row);
            tileSprite.VertexZ     = TileVertexZ(column, row);
            tileSprite.AnchorPoint = CCPoint.Zero;
            tileSprite.Opacity     = Opacity;
            tileSprite.FlipX       = false;
            tileSprite.FlipY       = false;
            tileSprite.Rotation    = 0.0f;

            if ((gidAndFlags.Flags & CCTileFlags.TileDiagonal) != 0)
            {
                CCSize halfContentSize = tileSprite.ContentSize * 0.5f;

                tileSprite.AnchorPoint = CCPoint.AnchorMiddle;
                tileSprite.Position   += new CCPoint(halfContentSize.Width, halfContentSize.Height);

                CCTileFlags horAndVertFlag = gidAndFlags.Flags & (CCTileFlags.Horizontal | CCTileFlags.Vertical);

                // Handle the 4 diagonally flipped states.
                if (horAndVertFlag == CCTileFlags.Horizontal)
                {
                    tileSprite.Rotation = 90.0f;
                }
                else if (horAndVertFlag == CCTileFlags.Vertical)
                {
                    tileSprite.Rotation = 270.0f;
                }
                else if (horAndVertFlag == (CCTileFlags.Vertical | CCTileFlags.Horizontal))
                {
                    tileSprite.Rotation = 90.0f;
                    tileSprite.FlipX    = true;
                }
                else
                {
                    tileSprite.Rotation = 270.0f;
                    tileSprite.FlipX    = true;
                }
            }
            else
            {
                if ((gidAndFlags.Flags & CCTileFlags.Horizontal) != 0)
                {
                    tileSprite.FlipX = true;
                }

                if ((gidAndFlags.Flags & CCTileFlags.Vertical) != 0)
                {
                    tileSprite.FlipY = true;
                }
            }

            if (addToTileMapLayer)
            {
                AddChild(tileSprite, flattendedIndex, flattendedIndex);
            }

            RemoveTile(column, row);

            return(tileSprite);
        }
예제 #15
0
 void InitialiseDrawBuffers(CCTileSetInfo[] tileSetInfos)
 {
     drawBufferManagers = new List<CCTileMapDrawBufferManager>();
     foreach (var tileSetInfo in tileSetInfos)
     {
         // Initialize the QuadsVertexBuffers
         if (tileSetInfo.TilesheetSize != CCSize.Zero)
         {
             drawBufferManagers.Add(InitialiseDrawBuffer(tileSetInfo));
         }
     }
 }
예제 #16
0
 CCTileMapLayer(CCTileSetInfo tileSetInfo, CCTileLayerInfo layerInfo, CCTileMapInfo mapInfo, CCTileMapCoordinates layerSize, int totalNumberOfTiles)
     : this(tileSetInfo, layerInfo, mapInfo, layerSize, totalNumberOfTiles, (int)(totalNumberOfTiles * 0.35f + 1),
            CCTextureCache.SharedTextureCache.AddImage(tileSetInfo.TilesheetFilename))
 {
 }
예제 #17
0
 CCTileMapLayer(CCTileSetInfo[] tileSetInfos, CCTileLayerInfo layerInfo, CCTileMapInfo mapInfo, CCTileMapCoordinates layerSize, int totalNumberOfTiles)
     : this(tileSetInfos, layerInfo, mapInfo, layerSize, totalNumberOfTiles, (int)(totalNumberOfTiles * 0.35f + 1))
 {
 }
예제 #18
0
        // Private constructor chaining

        CCTileMapLayer(CCTileSetInfo tileSetInfo, CCTileLayerInfo layerInfo, CCTileMapInfo mapInfo, CCTileMapCoordinates layerSize)
            : this(tileSetInfo, layerInfo, mapInfo, layerSize, (int)(layerSize.Row * layerSize.Column))
        {
        }
예제 #19
0
 CCTileMapLayer(CCTileSetInfo tileSetInfo, CCTileLayerInfo layerInfo, CCTileMapInfo mapInfo, CCTileMapCoordinates layerSize, int totalNumberOfTiles) 
     : this(tileSetInfo, layerInfo, mapInfo, layerSize, totalNumberOfTiles, (int)(totalNumberOfTiles * 0.35f + 1), 
         CCTextureCache.SharedTextureCache.AddImage(tileSetInfo.TilesheetFilename))
 {
 }
예제 #20
0
        void ParseTilesetElement()
        {
            string externalTilesetFilename = null;

            // Tileset source
            if (currentAttributeDict.TryGetValue(TilesetElementFileSource, out externalTilesetFilename))
            {
                externalTilesetFilename = CCFileUtils.FullPathFromRelativeFile(externalTilesetFilename, 
                    TileMapFileName);

                currentFirstGID = short.Parse(currentAttributeDict[TilesetElementFirstGid]);

                ParseXmlFile(externalTilesetFilename);
            }
            else
            {
                var tileset = new CCTileSetInfo();

                tileset.Name = currentAttributeDict[TilesetElementName];

                // First GID
                if (currentFirstGID == 0)
                {
                    tileset.FirstGid = short.Parse(currentAttributeDict[TilesetElementFirstGid]);
                }
                else
                {
                    tileset.FirstGid = currentFirstGID;
                    currentFirstGID = 0;
                }

                string tileSpacingStr = null;
                string borderSizeStr = null;

                // Tilesheet tile spacing
                if(currentAttributeDict.TryGetValue(TilesetElementTileSpacing, out tileSpacingStr))
                    tileset.TileSpacing = int.Parse(tileSpacingStr);

                // Tilesheet border width
                if (currentAttributeDict.TryGetValue(TilesetElementBorderSize, out borderSizeStr))
                    tileset.BorderWidth = int.Parse(borderSizeStr);

                // Tile texel size
                CCSize tileTexelSize;
                tileTexelSize.Width = CCUtils.CCParseFloat(currentAttributeDict[TilesetElementTexelWidth]);
                tileTexelSize.Height = CCUtils.CCParseFloat(currentAttributeDict[TilesetElementTexelHeight]);
                tileset.TileTexelSize = tileTexelSize;

                Tilesets.Add(tileset);
            }
        }
예제 #21
0
            public CCTileMapDrawBufferManager(int mapCols, int mapRows, CCTileMapLayer tileMapLayer, CCTileSetInfo tileSetInfo)
            {
                Buffers = new List<CCTileMapVertAndIndexBuffer>();
                TileSetInfo = tileSetInfo;
                TileMapLayer = tileMapLayer;

                // Create the appropriate number of buffers to hold the map.
                int numOfTiles = mapCols * mapRows;
                int tilesProcessed = 0;
                while (tilesProcessed < numOfTiles)
                {
                    int tilesLeft = numOfTiles - tilesProcessed;
                    int tilesInThisBuffer = Math.Min(tilesLeft, MaxTilesPerDrawBuffer);

                    CreateDrawBuffer(tilesInThisBuffer, tilesProcessed);

                    tilesProcessed += tilesInThisBuffer;
                }
            }
예제 #22
0
        CCTileMapDrawBufferManager InitialiseDrawBuffer(CCTileSetInfo tileSetInfo)
        {
            CCTileMapDrawBufferManager drawBufferManager = new CCTileMapDrawBufferManager(LayerSize.Row, LayerSize.Column, this, tileSetInfo);

            for (int y = 0; y < LayerSize.Row; y++)
            {
                for (int x = 0; x < LayerSize.Column; x++)
                {
                    UpdateQuadAt(drawBufferManager, x, y, false);
                }
            }
            drawBufferManager.UpdateQuadBuffers();
            return drawBufferManager;
        }
예제 #23
0
        CCTileMapLayer(CCTileSetInfo tileSetInfo, CCTileLayerInfo layerInfo, CCTileMapInfo mapInfo, CCTileMapCoordinates layerSize, 
            int totalNumberOfTiles, int tileCapacity, CCTexture2D texture)
        {

            //Debug.Assert(texture.ContentSizeInPixels != CCSize.Zero, string.Format("Tilemap Texture {0} not loaded for layer {1}", tileSetInfo.TilesheetFilename, layerInfo.Name));

            if (texture.ContentSizeInPixels == CCSize.Zero)
                CCLog.Log("Tilemap Layer Texture {0} not loaded for layer {1}", tileSetInfo.TilesheetFilename, layerInfo.Name);

            LayerName = layerInfo.Name;
            LayerSize = layerSize;
            Opacity = layerInfo.Opacity;
            LayerProperties = new Dictionary<string, string>(layerInfo.Properties);

            MapType = mapInfo.MapType;
            TileTexelSize = mapInfo.TileTexelSize;
            TileSetInfo = tileSetInfo;

            Position = LayerOffset(layerInfo.TileCoordOffset);
            ContentSize = LayerSize.Size * TileTexelSize * CCTileMapLayer.DefaultTexelToContentSizeRatios;

            tileSetTexture = texture;
            tileGIDAndFlagsArray = layerInfo.TileGIDAndFlags;

            TileSetInfo.TilesheetSize = tileSetTexture.ContentSizeInPixels;

            UpdateTileCoordsToNodeTransform();

            ParseInternalProperties();

            InitialiseQuadsVertexBuffer();
            InitialiseIndexBuffer();
        }
예제 #24
0
 public CCTileMapLayer(CCTileSetInfo tileSetInfo, CCTileLayerInfo layerInfo, CCTileMapInfo mapInfo)
     : this(tileSetInfo, layerInfo, mapInfo, layerInfo.LayerDimensions)
 {
 }