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

}

そこで、int配列からスプライトの束を作成し、それらをどこに配置するかを指示してから、それらをnsmutable配列タイルに追加します。次に、アレイ内のすべてをゆっくりと左に移動し、約20FPSを失います。タイルシステムを作成するためのより効率的な方法は何ですか?私の目標は、後でランダムに生成されたタイルを作成することです。

- (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);
    }
}

編集:awnserは

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;
    }
}
4

2 に答える 2

1

ループの外側で変数をプリロードしtempspriteます。

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

そして、ループ内でそれらを参照します。

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

またはさらに良い:

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

ああ、あなたの内側のループは26ではなく24を参照する必要があります。

于 2013-03-26T00:18:31.110 に答える
1

間違っているのは、CCSpriteBatchNodeを使用していないことです。CCSpriteBatchNodeは、タイルごとに1回の描画操作を実行するのではなく、1回の描画操作ですべてのタイルを描画します。欠点は、バッチノードの各タイルが(ある意味で)同じzOrderを持ち、すべてがバッチノードごとに1つのソーススプライトシートを使用する必要があることです。したがって、基本的に、異なるzOrdersで異なるレイヤーが必要な場合、またはタイルに異なるソースイメージを使用する異なるレイヤーが必要な場合は、それぞれに1つずつ、複数のバッチノードを作成する必要があります。

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

于 2013-03-26T00:25:31.767 に答える