我想要做的是創造遊戲開始之前,我需要爲某個級別的所有精靈,所以我沒有太多的精靈立刻。如何從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。
您應該提前創建精靈並重用它們,而不是在運行中創建新的(相對較慢,尤其是如果紋理未預先加載) – LearnCocos2D 2014-10-27 15:22:06
@ LearnCocos2D我之前創建它們,我只是調用addChild如所須。 addChild是導致下降的原因。我在想,也許是因爲它的addChild調用太多了。也許延遲他們會有所幫助? – Xofear 2014-10-27 17:19:47