ios – SpriteKit中的无尽滚动背景

前端之家收集整理的这篇文章主要介绍了ios – SpriteKit中的无尽滚动背景前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试使用Apple的SpriteKit进行侧滚动游戏.当想要制作无休止的滚动背景时,我遇到了这个 answer.

在实施解决方案后,它似乎确实有效,尽管它显着降低了我的FPS.这可能是由于在每一帧上重新计算图像位置的事实.

我觉得如果我可以使用一个或多个SKAction调用来处理这个动画会更好,但我不确定如何实现它.

思考?

到目前为止我在我的场景类中的代码(这只是在屏幕上激活了一次背景)

  1. - (void)addBackgroundTileAtPoint:(CGPoint)point {
  2.  
  3. SKSpriteNode *bg = [SKSpriteNode spriteNodeWithImageNamed:@"background"];
  4. bg.anchorPoint = CGPointZero;
  5. bg.position = point;
  6. bg.name = @"background";
  7. bg.zPosition = -99;
  8. [self addChild:bg];
  9.  
  10. SKAction *sequence = [SKAction sequence:@[
  11. [SKAction moveByX:-(bg.size.width * 2) y:0 duration:10],[SKAction removeFromParent]
  12. ]];
  13. [bg runAction: sequence];
  14. }

解决方法

我在上一个开源项目中为一个特殊的需求做了一个名为SKScrollingNode的小组件: SprityBird.

即使有3层或4层(视差),FPS也不是问题,但您可能需要自己尝试.

要使用它,您只需像任何其他节点一样添加它并给它一个scrollingSpeed likeo:

  1. back = [SKScrollingNode scrollingNodeWithImageNamed:@"back" inContainerWidth:WIDTH(self)];
  2. [back setScrollingSpeed:BACK_SCROLLING_SPEED];
  3. [self addChild:back];

SKScrollingNode.h

  1. @interface SKScrollingNode : SKSpriteNode
  2.  
  3. @property (nonatomic) CGFloat scrollingSpeed;
  4.  
  5. + (id) scrollingNodeWithImageNamed:(NSString *)name inContainerWidth:(float) width;
  6. - (void) update:(NSTimeInterval)currentTime;
  7.  
  8. @end

SKScrollingNode.m

  1. @implementation SKScrollingNode
  2.  
  3. + (id) scrollingNodeWithImageNamed:(NSString *)name inContainerWidth:(float) width
  4. {
  5. UIImage * image = [UIImage imageNamed:name];
  6.  
  7. SKScrollingNode * realNode = [SKScrollingNode spriteNodeWithColor:[UIColor clearColor] size:CGSizeMake(width,image.size.height)];
  8. realNode.scrollingSpeed = 1;
  9.  
  10. float total = 0;
  11. while(total<(width + image.size.width)){
  12. SKSpriteNode * child = [SKSpriteNode spriteNodeWithImageNamed:name ];
  13. [child setAnchorPoint:CGPointZero];
  14. [child setPosition:CGPointMake(total,0)];
  15. [realNode addChild:child];
  16. total+=child.size.width;
  17. }
  18.  
  19. return realNode;
  20. }
  21.  
  22. - (void) update:(NSTimeInterval)currentTime
  23. {
  24. [self.children enumerateObjectsUsingBlock:^(SKSpriteNode * child,NSUInteger idx,BOOL *stop) {
  25. child.position = CGPointMake(child.position.x-self.scrollingSpeed,child.position.y);
  26. if (child.position.x <= -child.size.width){
  27. float delta = child.position.x+child.size.width;
  28. child.position = CGPointMake(child.size.width*(self.children.count-1)+delta,child.position.y);
  29. }
  30. }];
  31. }
  32. @end

猜你在找的iOS相关文章