2014-02-11 64 views
8

我正在嘗試使用Apple的SpriteKit進行側滾動遊戲。當想要製作無盡的滾動背景時,我碰到了這個answerSpriteKit中無盡的滾動背景

實施該解決方案後,似乎工作雖然它顯着降低我的FPS。這可能是由於圖像位置正在每幀重新計算。

我覺得如果我可以使用一個或多個SKAction調用來照顧這個動畫,但我不確定如何實現它會好得多。

想法?

我已經在我的場景類到目前爲止,該代碼(這僅動畫在屏幕上的背景一次雖然)

- (void)addBackgroundTileAtPoint:(CGPoint)point { 

    SKSpriteNode *bg = [SKSpriteNode spriteNodeWithImageNamed:@"background"]; 
    bg.anchorPoint = CGPointZero; 
    bg.position = point; 
    bg.name = @"background"; 
    bg.zPosition = -99; 
    [self addChild:bg]; 

    SKAction *sequence = [SKAction sequence:@[ 
     [SKAction moveByX:-(bg.size.width * 2) y:0 duration:10], 
     [SKAction removeFromParent] 
    ]]; 
    [bg runAction: sequence]; 
} 
+0

除非滾動是恆定的,否則動作對你不會有任何好處:相同速度的相同方向。即使那樣,我懷疑行動將比答案的實施更快。雖然它可能會更快,但如果不是enumerateByName,則只需引用兩個背景精靈,以便SK不需要按名稱搜索節點圖。 – LearnCocos2D

+0

您需要在這裏*遞歸調用序列。即在[SKAction removeFromParent]之後,添加[self addBackgroundTileAtPoint:] ;,或者您應該使用重複動作而不從超級視圖中移除背景 –

+0

@ LearnCocos2D如果行動不是要走的路,那麼您是否對優化其他答案有任何建議解決方案還是您有不同的解決方案。當在仿真器上運行該答案的解決方案時,FPS立即從60降至〜30。 –

回答

12

我做了對我的最後一個開源項目,它特別需要叫SKScrollingNode小部件:SprityBird

即使有3或4層(視差),FPS也不是問題,但您可能需要自己嘗試。

要使用它,你只需要添加它像任何其他節點,並給它一個scrollingSpeed likeso:

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

SKScrollingNode.h

@interface SKScrollingNode : SKSpriteNode 

@property (nonatomic) CGFloat scrollingSpeed; 

+ (id) scrollingNodeWithImageNamed:(NSString *)name inContainerWidth:(float) width; 
- (void) update:(NSTimeInterval)currentTime; 

@end 

SKScrollingNode.m

@implementation SKScrollingNode 

+ (id) scrollingNodeWithImageNamed:(NSString *)name inContainerWidth:(float) width 
{ 
    UIImage * image = [UIImage imageNamed:name]; 

    SKScrollingNode * realNode = [SKScrollingNode spriteNodeWithColor:[UIColor clearColor] size:CGSizeMake(width, image.size.height)]; 
    realNode.scrollingSpeed = 1; 

    float total = 0; 
    while(total<(width + image.size.width)){ 
     SKSpriteNode * child = [SKSpriteNode spriteNodeWithImageNamed:name ]; 
     [child setAnchorPoint:CGPointZero]; 
     [child setPosition:CGPointMake(total, 0)]; 
     [realNode addChild:child]; 
     total+=child.size.width; 
    } 

    return realNode; 
} 

- (void) update:(NSTimeInterval)currentTime 
{ 
    [self.children enumerateObjectsUsingBlock:^(SKSpriteNode * child, NSUInteger idx, BOOL *stop) { 
     child.position = CGPointMake(child.position.x-self.scrollingSpeed, child.position.y); 
     if (child.position.x <= -child.size.width){ 
      float delta = child.position.x+child.size.width; 
      child.position = CGPointMake(child.size.width*(self.children.count-1)+delta, child.position.y); 
     } 
    }]; 
} 
@end 
+1

令人敬畏的工作,但隨着iOS 9的發佈,enumerateObjectsUsingBlock在使用和SKSpriteNode時會拋出一個不兼容的塊指針錯誤。玩了一段時間後,再搜索一下,我發現瞭解決這個問題的以下文章。 http://stackoverflow.com/questions/33584180/incompatible-block-pointer-skspritenode/33584230#33584230 – Grenter

1

我一直在爲一個無限的平鋪卷軸庫工作,你可以很容易地使用它來創建一個sc滾動的背景。看看它:

RPTileScroller

我作出了努力,使其成爲最有效的可能,但我不是一個遊戲開發商。我用我的iPhone 5和10×10像素的隨機顏色瓷磚進行了試用,並以穩定的60 fps運行。