2014-10-27 46 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