【问题标题】:How do I create a more efficient portrait gallery using Cocos2d?如何使用 Cocos2d 创建更高效​​的肖像画廊?
【发布时间】:2012-08-06 16:57:21
【问题描述】:

我正在构建一个包含肖像画廊(如博物馆)的应用,我的角色从左到右从左到右走过它们。我的肖像(图像)都是 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];

            }
        } 
    }
}   
}

【问题讨论】:

    标签: cocos2d-iphone nsmutablearray gallery ccsprite parallax


    【解决方案1】:

    您应该只需要一次加载 3 张图像以允许在任一方向滚动(假设您也不允许在 y 方向移动)。显示的那个,两边的一个作为缓冲区,然后根据需要延迟加载和替换。

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

    【讨论】:

    • 我理解您推荐的原则,但不清楚如何有效实施。一个接一个地做似乎效率不高。有没有办法用for循环或其他东西来做?
    • 维护一个图像数组,然后根据您行进的方向从数组的另一端移除项目并在另一端推送一个新项目。即 3 个项目,如果向左
    • 正如您从我上面发布的代码中看到的那样,我几乎已经在按照您的建议进行操作了。我的问题是,每次角色移动时我都必须手动检查每个精灵(有 100 个要检查!)并确切知道它们在哪里,以确定要添加/删除哪些精灵。一定有更好的办法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多