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(); }
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); }
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; } }
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); } }
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); }
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)); } } }
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; } }
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); } }
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); } }
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++; } } } }
// Private constructor chaining CCTileMapLayer(CCTileSetInfo tileSetInfo, CCTileLayerInfo layerInfo, CCTileMapInfo mapInfo, CCTileMapCoordinates layerSize) : this(tileSetInfo, layerInfo, mapInfo, layerSize, (int)(layerSize.Row * layerSize.Column)) { }
public CCTileMapLayer(CCTileSetInfo tileSetInfo, CCTileLayerInfo layerInfo, CCTileMapInfo mapInfo) : this(tileSetInfo, layerInfo, mapInfo, layerInfo.LayerDimensions) { }
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(); }
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); }
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)); } } }
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)) { }
CCTileMapLayer(CCTileSetInfo[] tileSetInfos, CCTileLayerInfo layerInfo, CCTileMapInfo mapInfo, CCTileMapCoordinates layerSize, int totalNumberOfTiles) : this(tileSetInfos, layerInfo, mapInfo, layerSize, totalNumberOfTiles, (int)(totalNumberOfTiles * 0.35f + 1)) { }
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); } }
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; } }
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; }
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(); }