我有一个简单的游戏,我一直在努力,一个滚动太空冒险,你可以拯救猫。一个非常简单的游戏,但我遇到了一个问题。我的游戏正常启动,显示主菜单场景。点击播放,它没有问题就过渡到游戏场景,但是,我发现第一次按开始开始游戏时,我得到了一些加载延迟。这种延迟仅在您第一次加载游戏时出现。
点击开始时,会调用以下方法:
-(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很新。
有人有想法吗?
提前致谢。
答案 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];
希望它能为你做到这一点。