【发布时间】:2014-07-11 11:21:34
【问题描述】:
全部。 我现在正在使用 sprite kit 开发一个 ios 游戏。游戏机制包括:从上到下无限滚动 sprite。
我的游戏场景只有 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
}
游戏帧数为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;
}
【问题讨论】:
-
您的精灵图像的大小是多少?它们是从 sprites.atlas 加载的吗?
-
我的 sprite 图片都是一样的大小:390*512。我不使用 sprites.atlas。
-
很奇怪。不应该有这样的问题。你能发布你的 createNode 吗?
-
我把代码贴在帖子里。
-
使用 Time Profiler 确定哪一行代码最昂贵
标签: objective-c sprite-kit frame-rate skspritenode sknode