ios - 创建 Sprite 时无法在等距平铺 map 中找出正确的 vertexZ

标签 ios cocos2d-iphone z-order isometric

我有一个 50 X 50 等轴测图 Tiled Map带底砖:64 X 32。

我正在使用此函数创建 Sprite 并动态添加到特定图 block 。

-(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 map 中唯一的图层,我已将属性 cc_vertexz = -1000 添加到该图层。

我采用了 KnightFight 项目中的 calculateVertexZ 方法。基于等距 map 上的图 block 坐标,它将计算 vertexZ,一旦您看到 map ,它似乎也有意义。

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

这是墙上的图片 - enter image description here

问题是—— enter image description here

案例一 根据 calculateVertexZ 方法,(0,0) 应该在 (0,1) 之后。因此 ( (0,1) 上的 Sprite 在 (0,0) 上呈现 OVER Sprite 。

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

我读到过,当两个 Sprite 只有相同的 vertexZ 时,之后添加的 Sprite 将位于顶部。但是这里的 Sprite 有不同的 vertexZ 值,创建顺序仍然高于它。

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

最佳答案

我通过使用基本图 block 的 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 - 创建 Sprite 时无法在等距平铺 map 中找出正确的 vertexZ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18327579/

相关文章:

ios - 适用于 iOS 的 NSColorList,或在 IB 和代码之间共享颜色的某种方式

ios - cocos2d 3.x CCButton 设置 Sprite 帧图像失真和回调/ block 不工作

windows - 在 Windows 上,当我的子窗口的 z 顺序相对于其 sibling 之一发生变化时,它是否应该获得 WM_WINDOWPOSCHANGED?

ios - 如何知道用户何时启动了 Apple Watch 应用程序?

javascript - <select> 标签的选择器轮在 React-JS PWA 的 iphone ios 15 中不显示

ios - 创建编辑按钮

ios - (Cocos2D) Sprite 没有完美地位于其他 sprite 之上?

iphone - 如何使用 CCTMXTiledMap 保存 tmx 文件

iphone - 更改 iPhone 上 subview 的 z 顺序

c++ - 窗口处理管理器