我有一个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];
}


Floor图层是我的Tiled地图中的唯一图层,并且我已将cc_vertexz = -1000属性添加到此图层。

我从KnightFight项目中采用了calculateVertexZ方法。根据等轴测图上的图块坐标,它将计算vertexZ,一旦您看到该图,它似乎也很有意义。

-(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);
}


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

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)上的精灵。

情况二
根据calculateVertexZ方法,(4,0)应该位于(4,1)之后。但是不知何故,因为我在(4,1)之后在(4,0)上添加了块,因此无法获得期望的结果。

我已经读到,当两个子画面只有相同的vertexZ时,以后添加的那个子画面都将位于最上面。但是在这里,子画面具有不同的vertexZ值,但是创建顺序仍然是最重要的。

另外,我无法弄清楚该方程式中对zorder的处理方式。 SOMEBODY PLS帮助

最佳答案

我通过使用基础图块的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];
}

关于ios - 创建子画面时无法在等距平铺贴图中找到正确的vertexZ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18327579/

10-15 15:16