创建精灵时,无法在等轴拼贴地图中找出正确的顶点

我有一个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项目中计算出了VertexZ方法。 根据等轴测图上的瓦片坐标,它会计算顶点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);
}

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

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,0)后加上块(4,1)并没有给我想要的结果。

我已经读过,当两个精灵只有相同的顶点时,那么后面添加的精灵将会在顶端。 但是这里的精灵有不同的顶点值,但创建的顺序却是压倒性的。

另外,我无法弄清楚在这个方程中如何处理zorder。 某人PLS帮助


我通过使用基本tile的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];
}
链接地址: http://www.djcxy.com/p/71203.html

上一篇: Cannot figure out correct vertexZ in Isometric Tiled maps when creating sprites

下一篇: Get next/previous item in an ObjectListView