1

ベース タイル: 64 X 32の 50 X 50 アイソメタイル マップがあります。

この関数を使用してスプライトを作成し、特定のタイルに動的に追加しています。

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

これが壁の画像です -ここに画像の説明を入力

そしてここに問題があります - ここに画像の説明を入力

ケース 1 (0,0) は、calculateVertexZ メソッドに従って (0,1) の後ろにある必要があります。したがって、( (0,1) のスプライトは (0,0) の OVER スプライトにレンダリングされます。

ケース 2 (4,0) は、calculateVertexZ メソッドに従って (4,1) の後ろにある必要があります。しかし、どういうわけか、(4,0) AFTER (4,1) にブロックを追加しているため、望ましい結果が得られません。

私は、2 つのスプライトが同じ頂点 Z のみを持つ場合、後で追加されたスプライトが一番上になることを読みました。ただし、ここではスプライトの vertexZ 値が異なりますが、それでも作成順序がそれをオーバーライドしています。

また、この式で zorder をどうするかわかりません。誰か助けてください

4

1 に答える 1