Spritekit动画加载时间

时间:2014-04-09 11:59:42

标签: ios xcode5

我有一个简单的游戏,我一直在努力,一个滚动太空冒险,你可以拯救猫。一个非常简单的游戏,但我遇到了一个问题。我的游戏正常启动,显示主菜单场景。点击播放,它没有问题就过渡到游戏场景,但是,我发现第一次按开始开始游戏时,我得到了一些加载延迟。这种延迟仅在您第一次加载游戏时出现。

点击开始时,会调用以下方法:

-(void)nonplayerSprites:(StartReason)endReason{
if (endReason == kStartGame){
//    [self playMusic:@"Electrodoodle.mp3"];
[self spawnPlayer];
[self setupUI];

[self runAction:[SKAction repeatActionForever: [SKAction sequence:@[[SKAction          
performSelector:@selector(enemySpawn) onTarget:self],
[SKAction waitForDuration:2.0]]]]];

[self runAction:[SKAction repeatActionForever: [SKAction sequence:@[[SKAction   
performSelector:@selector(spawnCat) onTarget:self],
[SKAction waitForDuration:1.5]]]]];

[self runAction:[SKAction repeatActionForever: [SKAction sequence:@[[SKAction 
performSelector:@selector(powerUpSpawnCheck) onTarget:self],[SKAction 
waitForDuration:2.0]]]]];


} else if (endReason == kEndGame){
    [self removeAllActions];
} else if (endReason == kRestartGame){
    MainGame * myScene =
    [[MainGame alloc] initWithSize:self.size];

    SKTransition *reveal =
    [SKTransition fadeWithDuration:0.5];

    [self.view presentScene: myScene transition: reveal];
}

}

我有四个精灵节点,一个UFO,一只猫,一个玩家火箭和一个随机加电。通过spawnUI方法调用两个用于玩家得分和生命总数的SKLabelNodes,此外,还将播放音乐。虽然我目前已禁用它。

使用类似的方法调用敌人和友方节点:

-(void)enemySpawn

{

int enemyChoice = [self getRandomNumberBetween:0 to:1];



if (enemyChoice == 0){

    _enemy = [SKSpriteNode spriteNodeWithImageNamed:@"enemy"];

    [_enemy setScale:1.0];

}else if (enemyChoice == 1){

    _enemy = [SKSpriteNode spriteNodeWithImageNamed:@"enemy_alt"];

    [_enemy setScale:0.50];

}

_enemy.anchorPoint = CGPointZero;

_enemy.zPosition = 2.0;

_enemy.name = @"rocket";

_enemy.position = CGPointMake(self.size.width + _enemy.size.width, [self 
getRandomNumberBetween:0 to:250]);



SKAction *enemyMove = [SKAction sequence:@[[SKAction moveToX:-40 duration:[self 
getRandomNumberBetween:2 to: 5]],

                                            [SKAction removeFromParent]]];

[_worldNode addChild:_enemy];

[_enemy runAction:enemyMove];
}

我觉得我知道问题是什么,游戏数据是第一次加载到ram中,但是如何在加载时避免暂停?我想知道我做错了什么,因为看起来我的装载不足以在按下开始按钮时引起明显的1到3秒暂停。第二次通过,比如玩家死亡并重新启动后,暂停消失,一切顺利播放。如果我遗漏任何重要信息,我很抱歉,我在SpriteKit很新。

有人有想法吗?

提前致谢。

1 个答案:

答案 0 :(得分:2)

我遇到了同样的问题。

当您使用 [SKSpriteNode spriteNodeWithImageNamed:@“enemy”] * [SKSpriteNode spriteNodeWithImageNamed:@“enemy_alt”] * 或任何其他纹理加载 方法,纹理不会存储在缓冲区中以便快速访问,因此首次调用这些方法会让您感到滞后。

接下来是解决方案:

添加游戏对象纹理的属性

@property(非原子,强)SKTexture * enemyTexture; 。 。

将方法添加到场景子类中:

-(void)preloadTextures
{
    self.enemyTexture = [SKTexture textureWithImageNamed:@"enemy"];
    .
    .
    .
    .

    [SKTexture preloadTextures:@[self.enemyTexture,...] withCompletionHandler:^{
        NSLog(@"Textures preloaded");
    }];
}

现在在演示之前调用该方法

MainGame * myScene =
[[MainGame alloc] initWithSize:self.size];

SKTransition *reveal =
[SKTransition fadeWithDuration:0.5];

[myScene preloadTextures];
[self.view presentScene: myScene transition: reveal];

希望它能为你做到这一点。