所有。 我正在使用精灵套件开发一款ios游戏。游戏机制包括:从上到下无限滚动精灵。
我的游戏场景只有3个精灵,顶部,中部,底部。 我有几十个精灵图像,所以我的解决方案是动态创建3个精灵(所以精灵可以填满整个屏幕),当底部精灵在屏幕外,然后销毁它;当顶级精灵 沿着顶部框架向下,创建一个新的精灵节点,然后交换底部,中间,顶部精灵。
伪代码: 在接口文件中:
- GameScene:SKScene
{
...
SKSpriteNode *_topSprite;
SKSpriteNode *_middleSprite;
SKSpriteNode *_bottomSprite;
...
}
在实施文件中:
- (void)update:(CFTimeInterval)currentTime
{
// 1 compute time interval
// 2 update sprite node
_topSprite.position move down 100*timeInterval
_middleSprite.position move down 100*timeInterval
_bottomSprite.position move down 100*timeInterval
// 3 crop the off-screen bottom sprite node
if (_bottomSprite is offScreen)
{
[_bottomSprite removeFromParent]
}
// 4 check the highest sprite position visible
// if the highest position is below the frame top,then create new sprite
_bottomSprite = _middleSprite;
_middleSprite = _topSprite;
_topSprite = [self createNewNode]; // random a sprite image
}
游戏fps为60,节点数不增加。 一切看起来都不错,但我发现有时游戏突然间会出现非常严重的扼流圈,导致移动的框架不连续。 在我的直觉中,我认为主要原因是由第4步引起的。 但我没有任何想法来解决它。 任何建议将不胜感激。
这是createNewNode方法:
- (SKSpriteNode *)createNewNode {
NSString *blockName = [self randomImageName];
SKSpriteNode *sprite = [[SKSpriteNode alloc] initWithImageNamed:blockName];
sprite.position = _highestPosition;
sprite.anchorPoint = CGPointMake(0.5, 0);
NSLog(@"putAnotherNodeOnTop %@", blockName);
[self addChild:sprite];
return sprite;
}
答案 0 :(得分:0)
一些建议。
由于您使用相同的三个图像,因此每次都不需要重新创建精灵。将隐藏值设置为YES,将精灵移动到某处,设置纹理然后再次显示隐藏值为NO应该更便宜。 SpriteKit不会在屏幕外绘制隐藏的节点。
当调用createNewNode:时,您的代码基本上会在更新的每一帧上请求磁盘上的PNG。在内存中加载纹理并根据需要将它们分配给精灵应该更高效。如果您只有几个,那么使它们成为SKTexture实例变量将是一种简单的方法。
使用spritesheets(纹理图集),在映射坐标处从内存中绘制图像要比每次从磁盘加载图像快得多。例如,在spritesheet中有三个图像,这可以是单个绘图调用。从磁盘这是三个单独的绘制调用。
您正在返回一个精灵并将其添加到createNewNode:方法中的场景中。也许这就是你想要的东西。它尽可能地重复努力。