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

Cocos2d iphone 如何使用Cocos2d创建更高效的肖像库?,cocos2d-iphone,nsmutablearray,gallery,ccsprite,parallax,Cocos2d Iphone,Nsmutablearray,Gallery,Ccsprite,Parallax,我正在构建一个应用程序,其中有肖像画廊(比如博物馆),我的角色从左到右到左走过。我的肖像(图像)都是2048x2048。我还没有缩小它们的尺寸,因为我想确保它们可以用于iPad版本。我知道它们的大尺寸是一个问题,因为当我试图一次加载所有图像时,它会崩溃(即使只有10个图像,启动也需要很长时间) 话虽如此,我真正的问题是尝试创建一种有效的方法来根据需要添加/删除它们(精灵)。我想出了一些可行的办法,但这显然不是最好的办法 我希望有人能提出一个更有效的方法 这是我的密码。您可以假设另一种方法负责将图

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

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

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

这是我的密码。您可以假设另一种方法负责将图像加载到称为framedSprites的可变数组中(但由于大小/崩溃,我一次只能加载10个)。每次屏幕位置更改时(通过触摸移动滑动),都会调用以下方法(checkPosition)。在我看来,我必须为数组中的每个图像/肖像创建类似的语句(非常低效且耗时)

-(无效)检查位置{
CGSize winSize=[CCDirector sharedDirector].winSize;
用于(CCSprite*framedSprites中的精灵){
if(sprite.tag==2){
如果((精灵位置x>2000.0f)和&(精灵位置x<2010.0f)){
CCSprite*肖像=(CCSprite*)[\u backgroundNode getChildByTag:0];
如果(纵向标记==0){
NSLog(@“从这张照片中删除剩下的两处肖像”);
[\u backgroundNode removeChildByTag:0清理:是];
}
}
如果((精灵位置x>1980.0f)和&(精灵位置x<1990.0f)){
CCSprite*肖像=(CCSprite*)[\u backgroundNode getChildByTag:0];
如果(纵向==零){
CCSprite*framedSprite=(CCSprite*)[framedSprites objectAtIndex:0];
NSLog(@“添加一幅左图,距此图2处”);
framedSprite.position=ccp(600,winSize.height/2);//计算这些位置也不高效且耗时
[_backgroundnodeaddchild:framedSprite z:0视差比:ccp(0.4f,0.5f)位置偏移:framedSprite.position];
}
} 
}
}   
}

一次只需加载3个图像,即可在任一方向上滚动(假设不允许在y方向上移动)。显示的一个,任一侧作为缓冲区,然后根据需要延迟加载和替换


如果你不需要同时看到整个图像,你也可以考虑使用像Tilen这样的自由工具将它切成瓦片(http://itunes.apple.com/gb/app/tilen/id409199185?mt=12)然后根据需要加载磁贴。

我理解您建议的原则,但不清楚如何有效实施。一个接一个地做似乎效率不高。有没有一种方法可以使用for循环或其他东西来实现这一点?维护一个图像数组,然后根据移动方向从数组的另一端移除该项目,并在另一端推一个新项目。i、 E3项如果你能从我上面发布的代码中看到,我已经在做你建议的事情了。我的问题是,每次角色移动时,我必须手动检查每个精灵(有100个精灵需要检查!),并准确地知道它们在哪里,以便确定要添加/删除哪些精灵。一定有更好的办法。
-(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];

            }
        } 
    }
}   
}