2 votes

la fabrication de mon propre système de tuiles cause du lag

- (void) loadStartingTiles //16 by 24
{
    [[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:
     @"clonespritesheet.plist"];

    for(int x = 0; x < 16; x++) //minus 1 for one at the begining
    {
        for(int y = 0; y < 26; y++)
        {
            CCSprite *tempsprite;
            switch (currentscreen[x][y])
            {
                case 0:
                    tempsprite = [CCSprite spriteWithSpriteFrameName:@"block0.png"];
                break;
                case 1:
                    tempsprite = [CCSprite spriteWithSpriteFrameName:@"block1.png"];
                break;
            }
            tempsprite.position = ccp(y*20+10,(16-x)*20-10); //+10 for align for tile size
            [self addChild:tempsprite z:3];
            [tiles addObject:tempsprite];
        }
    }

}

J'ai donc créé un tas de sprites à partir d'un tableau d'int qui leur indique où ils doivent être, puis je les ajoute dans le tableau nsmutable tile. ensuite, je déplace tout dans le tableau vers la gauche lentement, et je perds environ 20 FPS. quelle est une façon plus efficace de faire un système de tuiles ? mon but est de faire des tuiles générées aléatoirement plus tard.

- (void) manageTiles:(CGFloat)dt
{
    int tileamount = [tiles count];
    for(int i = 0; i < tileamount; i++)
    {
        CCSprite *tempsprite = [tiles objectAtIndex:i];
        tempsprite.position = ccp(tempsprite.position.x-20*dt,tempsprite.position.y);
    }
}

EDIT : l'awnser est

int themap = -20;
- (void) manageTiles:(CGFloat)dt
{
    tiles.position = ccp(tiles.position.x-10*dt,tiles.position.y);

    NSLog(@"%d",themap);
    if(tiles.position.x < themap)
    {
        CCSprite *tempsprite;
        for(int i = 0; i < 16; i++)
        {
            [tiles removeChildAtIndex:0 cleanup:YES];
        }
        for(int i = 0; i < 16; i++)
        {
            switch (tilewall[i])
            {
                case 0:
                    tempsprite = [CCSprite spriteWithSpriteFrameName:@"block1.png"];
                    break;
                case 1:
                    tempsprite = [CCSprite spriteWithSpriteFrameName:@"block1.png"];
                    break;
            }
            tempsprite.position = ccp((themap*-1)+500+10,((16-i)*20-10));
            [tiles addChild:tempsprite];
        }
        themap = themap-20;
    }
}

1voto

Richard Brown Points 7716

Précharger le tempsprite en dehors de votre boucle :

CSprite *sprite0 = [CCSprite spriteWithSpriteFrameName:@"block0.png"];
CSprite *sprite1 = [CCSprite spriteWithSpriteFrameName:@"block1.png"];

Et ensuite les référer à eux dans la boucle :

        switch (currentscreen[x][y])
        {
            case 0:
                tempsprite = sprite0;
            break;
            case 1:
                tempsprite = sprite1;
            break;
        }

ou encore mieux :

tempsprite = currentscreen[x][y] ? sprite1 : sprite0;

Oh, et votre boucle interne devrait se référer à 24, pas à 26.

1voto

dqhendricks Points 11630

Là où vous faites fausse route, c'est que vous n'utilisez pas un CCSpriteBatchNode. Un CCSpriteBatchNode dessinera toutes les tuiles en une seule opération de dessin au lieu de faire une opération de dessin par tuile. Les inconvénients sont que chaque tuile dans le nœud de lot aura le même zOrder (d'une certaine manière), et tout cela doit utiliser une spritesheet source par nœud de lot. Donc, si vous voulez des couches différentes à des zOrders différents, ou des couches différentes qui utilisent des images sources différentes pour les tuiles, vous devrez créer plusieurs nœuds de lot, un pour chaque.

http://www.cocos2d-iphone.org/api-ref/0.99.5/interface_c_c_sprite_batch_node.html

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X