如何使用Cocos2d创建更高效​​的肖像库?

时间:2012-08-06 16:57:22

标签: cocos2d-iphone nsmutablearray gallery ccsprite parallax

我正在构建一个拥有肖像画廊(如博物馆)的应用程序,我的角色从左到右走过它们。我的肖像(图片)都是2048x2048。我还没有缩小它们的尺寸,因为我想确保它们可以用于iPad版本。我知道它们的大尺寸是一个问题,因为当我尝试一次加载所有这些时崩溃(即使只有10个图像也需要很长时间才能启动)。

话虽这么说,我真正的问题是尝试创建一种有效的方法来根据需要添加/删除它们(精灵)。我提出了一些有效的方法但显然不是最好的方法。

我希望有人能提出更有效的方法。

这是我的代码。你可以假设另一种方法负责将图像加载到一个名为framedSprites的可变数组中(除了因为大小/崩溃我一次只能加载10个)。每次屏幕位置更改时(通过TouchMoved滑动)都会调用以下方法(checkPosition)。在我看来,我将不得不为数组中的每个图像/肖像创建类似的语句(非常低效和耗时)......

-(void)checkPosition {

CGSize winSize = [CCDirector sharedDirector].winSize;

for (CCSprite *sprite in framedSprites) {

    if (sprite.tag == 2) {

        if ((sprite.position.x > 2000.0f)&&(sprite.position.x < 2010.0f)) {

            CCSprite *portrait = (CCSprite *)[_backgroundNode getChildByTag:0];

            if (portrait.tag == 0) {

                NSLog(@"Removing a Portrait Left 2 Places From This One");

                 [_backgroundNode removeChildByTag:0 cleanup:YES];

            }
        }

        if ((sprite.position.x > 1980.0f)&&(sprite.position.x < 1990.0f)) {

            CCSprite *portrait = (CCSprite *)[_backgroundNode getChildByTag:0];

            if (portrait == nil) {

                CCSprite * framedSprite = (CCSprite *)[framedSprites objectAtIndex:0];

                NSLog(@"Adding a Portrait Left, 2 Places From This One");

                framedSprite.position = ccp(600,winSize.height/2);  //figuring these positions is also not efficient and time consuming

                [_backgroundNode addChild:framedSprite z:0 parallaxRatio:ccp(0.4f,0.5f) positionOffset:framedSprite.position];

            }
        } 
    }
}   
}

1 个答案:

答案 0 :(得分:0)

您应该只需要同时加载3个图像以允许向任一方向滚动(假设您不允许在y方向上移动)。显示一个,一个作为缓冲区,然后是延迟加载并根据需要进行替换。

如果您不需要一次看到整个图像,您还可以考虑使用像Tilen这样的免费工具将其切割成瓷砖(http://itunes.apple.com/gb/app/tilen/id409199185?mt = 12)然后根据需要加载图块。