Spritekit 动画加载时间

Posted

技术标签:

【中文标题】Spritekit 动画加载时间【英文标题】:Spritekit animation load time 【发布时间】:2014-04-09 11:59:41 【问题描述】:

我有一个简单的游戏,我一直在开发,这是一个可以拯救猫的横向卷轴太空冒险游戏。一个非常简单的游戏,但我遇到了一个问题。我的游戏正常启动,显示主菜单场景。点击播放,它毫无问题地过渡到游戏场景,但是,我发现当我第一次按开始开始游戏时,我得到了一点加载延迟。此延迟仅在您第一次加载游戏时出现。

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

-(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 方法调用两个用于玩家得分和总生命的 SKLabelNode,此外,还会播放音乐。虽然我目前已禁用它。

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

-(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】:

我遇到了同样的问题。

似乎当您使用 [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 项目。

以上是关于Spritekit 动画加载时间的主要内容,如果未能解决你的问题,请参考以下文章

在 SpriteKit 中预加载纹理

SpriteKit 在哪里为数千个精灵加载纹理图集

SpriteKit 动画意外停止

SpriteKit - 动画 SKShapeNode 形状路径

SpriteKit 动画物理

在 SpriteKit 中创建带有动画的彗星需要认真的帮助