我有一个50 X 50等长Tiled Map与基础瓷砖:64 X 32。
我正在使用此函数创建一个精灵并动态添加到特定的图块。
-(void)addTile:(NSString *)tileName AtPos:(CGPoint)tilePos onTileMap:(CCTMXTiledMap *)tileMap
{
CCTMXLayer *floorLayer=[tileMap layerNamed:@"FloorLayer"];
NSAssert(floorLayer !=nil, @"Ground layer not found!");
CGPoint tilePositionOnMap = [floorLayer positionAt:tilePos];
CCSprite *addedTile = [[CCSprite alloc] initWithFile:tileName];
addedTile.anchorPoint = CGPointMake(0, 0);
addedTile.position = tilePositionOnMap;
addedTile.vertexZ = [self calculateVertexZ:tilePos tileMap:tileMap];
[tileMap addChild:addedTile];
}
地板图层是我的Tiled地图中唯一的图层,我已将属性 cc_vertexz = -1000 添加到此图层。
我从KnightFight项目中获取了calculateVertexZ方法。根据等距地图上的瓷砖坐标,它将计算顶点Z,一旦你看到地图,它似乎也有意义。
-(float) calculateVertexZ:(CGPoint)tilePos tileMap:(CCTMXTiledMap*)tileMap
{
float lowestZ = -(tileMap.mapSize.width + tileMap.mapSize.height);
float currentZ = tilePos.x + tilePos.y;
return (lowestZ + currentZ + 1);
}
现在这是我在我的-init
模板cocos2d-2项目的HelloWorldLayer
中编写的代码。 -
self.myTileMap = [CCTMXTiledMap tiledMapWithTMXFile:@"IsometricMap.tmx"];
[self addChild:self.myTileMap z:-100 tag:TileMapNode];
[self addTile:@"walls-02.png" AtPos:CGPointMake(0, 0) onTileMap:self.myTileMap];
[self addTile:@"walls-02.png" AtPos:CGPointMake(0, 1) onTileMap:self.myTileMap];
[self addTile:@"walls-02.png" AtPos:CGPointMake(4, 1) onTileMap:self.myTileMap];
[self addTile:@"walls-02.png" AtPos:CGPointMake(4, 0) onTileMap:self.myTileMap];
这是墙图像 -
这就是问题 -
案例1 根据calculateVertexZ方法,(0,0)应该落后于(0,1)。因此,((0,1)上的精灵在(0,0)上被渲染为OVER精灵。
案例2 (4,0)应根据calculateVertexZ方法落后于(4,1)。但不知何故,因为我在(4,0)AFTER(4,1)上添加了块,它没有给我想要的结果。
我曾经读过,当两个精灵只有相同的顶点时,无论后来添加哪个精灵都会在顶部。但是这里的精灵有不同的vertexZ值,仍然是创造的顺序。
另外,我无法弄清楚在这个等式中如何处理zorder。有些人帮助
答案 0 :(得分:-1)
我通过使用基础图块的vertexZ属性和zOrder属性解决了这个问题。
-(void)addTile:(NSString *)tileName AtPos:(CGPoint)tilePos onTileMap:(CCTMXTiledMap *)tileMap
{
CCTMXLayer *floorLayer=[tileMap layerNamed:@"FloorLayer"];
NSAssert(floorLayer !=nil, @"Ground layer not found!");
CCSprite *baseTile = [floorLayer tileAt:tilePos];
CCSprite *addedTile = [[CCSprite alloc] initWithFile:tileName];
addedTile.anchorPoint = CGPointMake(0, 0);
addedTile.position = baseTile.position;
addedTile.vertexZ = baseTile.vertexZ;
[tileMap addChild:addedTile z:baseTile.zOrder tag:tile.tag];
}