2014-10-27 50 views
0

我想要做的是創造遊戲開始之前,我需要爲某個級別的所有精靈,所以我沒有太多的精靈立刻。如何從NSArray中在運行時添加SKSpriteNode沒有幀率下降

我分裂它們變成4個陣列,每個陣列對應於水平的部分,電平被劃分成4個部分。

所以當玩家穿越到水平的部分場景將所有的精靈。 這種效果幾乎完美,除了在場景添加陣列的精靈時,幀速率有時會出現大幅下降。

是否有可能添加在運行時的精靈,而不會影響幀速率?

下面是一些僞代碼來解釋我想要做的事。

在SpriteClass.m

 _sprite = [[Sprite alloc] init]; 

     _sprite.position = location; 
     _sprite.anchorPoint = CGPointMake(.5,.5); 
     _sprite.zPosition = 5; 

     _sprite.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:  
     CGSizeMake 
     (_sprite.size.width, _sprite.size.height/4)]; 
     _sprite.physicsBody.dynamic = NO; 
     _sprite.physicsBody.restitution = 0.0; 
     _sprite.physicsBody.categoryBitMask = PCFloor; 
     _sprite.physicsBody.contactTestBitMask = PCPlayerCategory; 
     _sprite.physicsBody.collisionBitMask = PCPlayerCategory; 
     _sprite.name = @"sprite"; 


if (_sprite.position.x < 4000) { 
[[Singleton shared].spriteArray1 addObject:_sprite]; 

} 


else if (_sprite.position.x > 4000 && _sprite.position.x < 8000) { 
[[Singleton shared].spriteArray2 addObject:_sprite]; 

} 


else if (_sprite.position.x > 8000 && _sprite.position.x < 12000) { 
[[Singleton shared].spriteArray3 addObject:_sprite]; 

} 


else if (_sprite.position.x > 12000) { 
[[Singleton shared].spriteArray4 addObject:_sprite]; 

} 

在MyScene.m

spawnBox是玩家與相交,讓遊戲知道玩家是在哪個部分的矩形。

-(id)initWithSize:(CGSize)size { 
if (self = [super initWithSize:size]) { 

spawnNum = 1; 
[self spawn]; 


} 

return self; 
} 


-(void)spawn { 

switch (spawnNum) { 
case 1: 

     for (int x = 0; x < [Singleton shared].spriteArray1.count; ++x) { 
      [myScene addChild:[[Singleton shared].spriteArray1 
      addObject:_sprite]; objectAtIndex:x]]; 
     } 

     spawnBox = CGRectMake(3500, 0,32, _tileMap.mapSize.height * _tileMap.tileSize.height); 
     ++spawnNum; 

switch (spawnNum) { 
case 2: 

     for (int x = 0; x < [Singleton shared].spriteArray2.count; ++x) { 
      [myScene addChild:[[Singleton shared].spriteArray2 
      addObject:_sprite]; objectAtIndex:x]]; 
     } 

     spawnBox = CGRectMake(3500, 0,32, _tileMap.mapSize.height * _tileMap.tileSize.height); 
     ++spawnNum; 

    switch (spawnNum) { 
     case 3: 

     for (int x = 0; x < [Singleton shared].spriteArray3.count; ++x) { 
      [myScene addChild:[[Singleton shared].spriteArray3 
      addObject:_sprite]; objectAtIndex:x]]; 
     } 

     spawnBox = CGRectMake(3500, 0,32, _tileMap.mapSize.height * _tileMap.tileSize.height); 
     ++spawnNum; 

switch (spawnNum) { 
    case 4: 

     for (int x = 0; x < [Singleton shared].spriteArray4.count; ++x) { 
      [myScene addChild:[[Singleton shared].spriteArray4 
      addObject:_sprite]; objectAtIndex:x]]; 
     } 

     spawnBox = CGRectMake(3500, 0,32, _tileMap.mapSize.height * _tileMap.tileSize.height); 
     ++spawnNum; 

    default: 
     break; 
} 

} 

此外,我正在測試iphone 5c,6,ipad air,1st gen ipad mini。

+0

您應該提前創建精靈並重用它們,而不是在運行中創建新的(相對較慢,尤其是如果紋理未預先加載) – LearnCocos2D 2014-10-27 15:22:06

+0

@ LearnCocos2D我之前創建它們,我只是調用addChild如所須。 addChild是導致下降的原因。我在想,也許是因爲它的addChild調用太多了。也許延遲他們會有所幫助? – Xofear 2014-10-27 17:19:47

回答

0

你實現刪除精靈這沒有更明顯? 你可以嘗試順利地添加新的精靈。我的意思是一次添加不是全部部分,而是在關卡移動時添加部分關卡部分。

+0

@LetaOn我試着根據需要分配新的精靈,那會導致大幀速下降。我不能刪除任何可見的精靈,因爲在玩家回溯的情況下需要它們。 – Xofear 2014-10-27 17:22:36

+0

然後你可以在兩邊做。動態添加地圖。例如添加3個屏幕尺寸。當前屏幕,左側1個屏幕和右側1個屏幕。然後,當你移動其中的一個從場景中移除,並添加1個新的場景。 – Leta0n 2014-10-28 10:29:22