1

我有一个 50 X 50 等距平铺地图,基本平铺: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];
}

地板层是我平铺地图中的唯一层,我已将属性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);
}

现在这是-initHelloWorldLayer在模板 cocos2d-2 项目中编写的代码。-

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];

这是墙上的图像-在此处输入图像描述

这就是问题所在 - 在此处输入图像描述

根据 calculateVertexZ 方法,案例 1 (0,0) 应该在 (0,1) 之后。因此 ((0,1) 上的精灵被渲染为 (0,0) 上的 OVER 精灵。

根据 calculateVertexZ 方法,案例 2 (4,0) 应该在 (4,1) 之后。但不知何故,因为我在 (4,1) 之后在 (4,0) 上添加了块,所以它没有给我想要的结果。

我已经读过,当两个精灵只有相同的 vertexZ 时,以后添加的任何一个精灵都将在顶部。但是这里的精灵有不同的 vertexZ 值,仍然是创建顺序覆盖它。

另外,我不知道在这个等式中如何处理 zorder 。有人请帮忙

4

1 回答 1

-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];
}
于 2013-08-21T07:16:57.453 回答