我正在構建一個具有肖像畫廊(如博物館)的應用程序,我的角色從左至右走過它們。我的肖像(圖片)都是2048x2048。我還沒有減小它們的尺寸,因爲我想確保它們可以用於iPad版本。我知道他們的大尺寸是一個問題,因爲當我嘗試一次加載它們時(即使僅有10張圖像需要很長時間才能啓動),它會崩潰。如何使用Cocos2d創建更高效的肖像畫廊?
這就是說,我真正的問題是試圖創建一個有效的方法來添加/刪除它們(精靈)根據需要。我想出了一些可行的方法,但顯然不是最好的方法。
我希望有人可以建議一個更有效的方法。
這是我的代碼。你可以假設另一個方法負責將圖像加載到一個名爲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];
}
}
}
}
}
我瞭解您推薦的原則,但不清楚如何有效實施它。一個接一個地做並不顯得非常有效。沒有辦法做一個for循環或什麼的? – 2012-08-08 15:15:22
維護您的圖像陣列,然後根據您移動的方向從陣列的另一端移除物品並在另一端推送新物品。即3個項目如果向左< - 從數組中彈出最後一個項目(並在其後清理)並在數組中的位置[0]添加一個新項目。 加載(&解壓縮時間)和內存使用量之間會有一個折衷。 有了Cocos2d,如果加載速度是一個問題,使用PNG的不JPG格式,cocos2d在做任何事情之前將JPG文件轉換爲png格式。 – abitofcode 2012-08-10 12:03:25
正如你從我上面發佈的代碼中可以看到的,我已經在做你正在建議的東西了。我的問題是,每次角色移動時都必須手動檢查每個精靈(有100個需要檢查!),並確切知道它們在哪裏以確定要添加/刪除哪些精靈。一定會有更好的辦法。 – 2012-08-10 15:29:39