Spritekit动画加载时间

3
我有一个简单的游戏正在开发,是一款侧滑太空冒险游戏,在游戏中你需要拯救猫咪。这是一款非常简单的游戏,但我遇到了一个问题。我的游戏正常启动,显示主菜单场景。点击“播放”,它会毫无问题地过渡到游戏场景,但是,我发现第一次按“开始”按钮开始游戏时会出现一点加载延迟。这种延迟只会在第一次加载游戏时出现。
点击“开始”后,将调用以下方法:
-(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];
}

我觉得我知道问题出在哪里了,游戏数据正在第一次加载到内存中,但是如何避免这种加载时的暂停呢?我想知道是否我做错了什么,因为似乎我没有加载足够的内容会造成明显的1到3秒的暂停。第二次通过,比如玩家死亡并重新开始,暂停就消失了,一切都顺利进行。如果我遗漏了任何重要信息,我很抱歉,我在SpriteKit方面还很新。 有人有什么想法吗?提前感谢。
1个回答

2

我有同样的问题。

当你使用[SKSpriteNode spriteNodeWithImageNamed:@"enemy"]*[SKSpriteNode spriteNodeWithImageNamed:@"enemy_alt"]*或其他任何纹理加载方法时,纹理不会存储在缓冲区中以便快速访问,因此这些方法的第一次调用会导致延迟。

解决方案如下:

为游戏对象的纹理添加属性:

@property(nonatomic,strong) 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];

希望这对您也有帮助。

在游戏的第一个场景或主视图控制器中预加载图片哪个更好?请原谅我的无知,这是我第一个SpriteKit项目。 - skamedly

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接