ベース タイル: 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);
}
これは、-init
私HelloWorldLayer
のテンプレート 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 をどうするかわかりません。誰か助けてください