2012-03-31 16 views
0

nach ein paar Kopfschmerzen ich herausgefunden, dass mit CCSpriteBatchNode mit cocos2d Olny Sprites hinzugefügt Z-Auftrag als Kind hinzugefügt (was offensichtlich ist, jetzt sehe ich ..)Der beste Weg für z-Bestellung Sprites auf der isometrischen Karte mit cocos2d

[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"token_default.plist"]; 
    CCSpriteBatchNode *tokenSpriteSheet = [CCSpriteBatchNode batchNodeWithFile:@"token_default.png"]; 
    [[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"objects_default.plist"]; 
    CCSpriteBatchNode *objectsSpriteSheet = [CCSpriteBatchNode batchNodeWithFile:@"objects_default.png"]; 

    CCSprite *token = [[[CCSprite alloc] initWithSpriteFrameName:@"token_SE.png"] autorelease]; 
    [token setPosition:tokenSpawnPoint]; 
    CCSprite *enemy = [[[CCSprite alloc] initWithSpriteFrameName:@"token_blak_SE.png"] autorelease]; 
    [enemy setPosition:enemySpawnPoint]; 
    CCSprite *houseA = [[[CCSprite alloc] initWithSpriteFrameName:@"house_small.png"] autorelease]; 
    [houseA setPosition:[self randomHousePosition]]; 
    CCSprite *houseB = [[[CCSprite alloc] initWithSpriteFrameName:@"house_big.png"] autorelease]; 
    [houseB setPosition:[self randomHousePosition]]; 

    [tokenSpriteSheet addChild:token]; 
    [tokenSpriteSheet addChild:enemy]; 
    [objectsSpriteSheet addChild:houseA]; 
    [objectsSpriteSheet addChild:houseB]; 

und da ich sie in die Anzeigeliste hinzufügen wie folgt ..

[_isoMap addChild:objectsSpriteSheet]; 
    [_isoMap addChild:tokenSpriteSheet]; 

gibt es keine Art, wie ich die z-Reihenfolge der einzelnen Token zwischen anderen Häusern ...
ändern sie werden immer über die h gerendert werden ouse, bis ich die Reihenfolge dieser Batch-Knoten ändern

btw, ich kann „merge“ alle Sprites' Kunst in einer großen Charge Knoten ... Dabei wurde es möglich, Sprites zu bestellen unter Verwendung von Koordinaten Sprites

[fullSpriteSheet reorderChild:token z:token.position.y]; 

Ich bin ein wenig mit ihm fest ... gibt es eine Möglichkeit, das zu erreichen, mit verschiedenen Sprite-Bacth-Knoten? oder ist es möglich, zwei batchnodes programmatisch zusammenzuführen? (Oder so ähnlich)

i gefunden KnightFight, ein wirklich interessantes offenes Projekt auf Github von LozArcher .. er verwendet CCSpriteFrame und CCSprite ‚s setDisplayFrame Methode anstelle von Batch-Knoten ... aber ich kann es nicht laufen seit es scheint eine ältere Version von cocos2d zu sein (anscheinend nicht mit Xcode 4 Arbeits)

Antwort

0

ich, dass die vertexZ Eigenschaft eines CCNode Wechsel fand heraus (wie ein CCSprite) es seine Z-Position tatsächlich ändert (so ist es etwas größer sein/kleiner, und auch übersetzt) ​​

so, um auf Z-Index CCSpr zu arrangieren ites mit unterschiedlichen spriteSheet i reorderChild Verfahren (nur die Rendering-Reihenfolge ändern) und vor allem muß ich NICHT CCSpriteBatchNode VERWENDUNG ..

nach einem wenig Refactoring des obigen Beispiels verwenden hatte sollte, ich habe:

CCSprite *token = [CCSprite spriteWithSpriteFrameName:@"token_SE.png"]; 
[token setPosition:tokenSpawnPoint]; 
CCSprite *enemy = [CCSprite spriteWithSpriteFrameName:@"token_blak_SE.png"]; 
[enemy setPosition:enemySpawnPoint]; 

CCSprite *houseA = [CCSprite spriteWithSpriteFrameName:@"house_small.png"]; 
[houseA setPosition:[self randomHousePosition]]; 
CCSprite *houseB = [CCSprite spriteWithSpriteFrameName:@"house_big.png"]; 
[houseB setPosition:[self randomHousePosition]]; 

[_isoMap addChild:token]; 
[_isoMap addChild:enemy]; 
[_isoMap addChild:houseA]; 
[_isoMap addChild:houseB]; 

ich habe auch jeden Sprit zu einem NSMutableArray und dann in einer for-Schleife (innerhalb der update geplanten Methode):

CCSprite *sprite = [mySpritesArray objectAtIndex:i]; 
[_isoMap reorderChild:sprite z:(_isoMap.mapSize.height - sprite.y)]; 

Hoffnung dies jemand helfen könnte :)

0

Ich denke immer noch, dass ist keine bessere Lösung, Wenn Ihre Objekte auf der Karte dynamisch bewegen, können Sie immer noch in z-Reihenfolge Probleme stecken.

Ich kenne seine sehr alten Post, und die Leute kommen immer wieder hier durch Google-Suche, , so dass ich hier Lösung posten.

float lowestZ = tilemap.map.width +tilemap.map.height ; 
float currentZ = self.gridLocation.x + self.gridLocation.y ; 
int zOrderDecided = lowestZ + currentZ - 1 ; 
[self.parent reorderChild:self z:zOrderDecided]; 
0

Setzen Sie die Sprites Z-Reihenfolge auf die Y-Position auf der Karte. Ordne deine dynamischen Sprites in einer Update-Schleife neu an. Berechnen Sie die Z-Reihenfolge mit der aktuellen Y-Position des Sprites und der sichtbaren Höhe der Karte.

void LocalGameController::SetZOrderForObject(cocos2d::Sprite *object){ 
    int objectZOrder = visibleSize.height - object->getPositionY(); 
    context->reorderChild(object, objectZOrder); 
}