2014-01-10 27 views
2

我試圖創建一個使用SpriteKit像這樣SpriteKit輸送帶

Screenshot

我的第一個反應是創建比屏幕傳送帶圖像更大然後反覆永隨其移動的傳送帶作用動作。但這看起來不太好,因爲它取決於屏幕尺寸。

有沒有更好的方法來做到這一點?

也很明顯,我想把東西(這將獨立移動)在傳送帶上,所以該節點是一個SKNode與正在移動的子精靈節點。

更新:我希望傳送帶「可視化」移動;所以線條朝着給人運動印象的方向移動。

回答

2

physicsBody應用於所有需要在傳送帶上移動並將affectedByGravity屬性設置爲NO的精靈。

在這個例子中,我假設代表你的傳送帶的spriteNode被稱爲conveyor。此外,所有需要移動的精靈節點都將字符串「可移動」作爲它們的name屬性。

然後,在你-update:方法,

-(void)update:(CFTimeInterval)currentTime 
{ 
    [self enumerateChildNodesWithName:@"moveable" usingBlock:^(SKNode *node, BOOL *stop{ 
     if ([node intersectsNode:conveyor]) 
     { 
      [node.physicsBody applyForce:CGVectorMake(-1, 0)]; 
      //edit the vector to get the right force. This will be too fast. 
     } 
    }]; 
} 

在此之後,只需添加上的正確位置所需的精靈,你會看到他們自己的移動。

對於動畫,最好使用可以在精靈上循環的紋理數組。

或者,您可以添加和刪除一系列帶有截面圖像的小精靈,並像移動傳送帶上的精靈一樣移動它們。

+0

嘿,謝謝你的反饋。我更新了我的問題。我正在尋找的效果是使傳送帶看起來像移動。像這樣http://www.randomfeature.co.uk/files/gimgs/47_quartet01.gif。什麼是獲得這種效果的好方法? –

+0

請檢查我的答案更新。 – ZeMoon

+0

當通過不同的紋理循環時,可能很難使動畫和對象同步(因此它們似乎以相同的速度移動)。但是,使用CoreAnimation可以輕鬆實現此效果(有幾種方法可以實現此目的,即搜索StackOverflow)。我們的想法是設置'view width = screen width + texture width',用'x = -texture width'移動到'x = 0'並重復。 – DarkDust

0

@akashg指出一個解決方案,跨越傳送帶移動的物體,我給我的答案是如何使輸送帶看起來好像正在

一個建議和我最初的直覺是放置比場景中的屏幕更大的矩形並反覆移動。經過反思,我認爲這不是一個好的解決方案,因爲如果我們想要在中間放置一條傳送帶,以某種方式我們看到它的結束,這將不可能沒有額外的剪貼蒙版。

理想的解決方案是在SKSpriteNode上平鋪SKTexture並恰好抵消該紋理;但是這似乎不適用於Sprite Kit(無瓦片機制)。

所以基本上我正在做的是從紋理創建子紋理,就像[瓦] [瓦](2次可重複的瓦片),我只是一個接一個地顯示這些子紋理來創建動畫。

下面是代碼:

- (SKSpriteNode *) newConveyor 
{ 
    SKTexture *conveyorTexture = [SKTexture textureWithImageNamed:@"testTextureDouble"]; 
    SKTexture *halfConveyorTexture = [SKTexture textureWithRect:CGRectMake(0.5, 0.0, 0.5, 1.0) inTexture:conveyorTexture]; 

    SKSpriteNode *conveyor = [SKSpriteNode spriteNodeWithTexture:halfConveyorTexture size:CGSizeMake(conveyorTexture.size.width/2, conveyorTexture.size.height)]; 

    NSArray *textureArray = [self horizontalTextureArrayForTxture:conveyorTexture]; 
    SKAction *moveAction = [SKAction animateWithTextures:textureArray timePerFrame:0.01 resize:NO restore:YES]; 
    [conveyor runAction:[SKAction repeatActionForever:moveAction]]; 

    return conveyor; 
} 

- (NSArray *) horizontalTextureArrayForTxture : (SKTexture *) texture 
{ 
    CGFloat deltaOnePixel = 1.0/texture.size.width; 
    int countSubtextures = texture.size.width/2; 

    NSMutableArray *textureArray = [[NSMutableArray alloc] initWithCapacity:countSubtextures]; 

    CGFloat offset = 0; 
    for (int i = 0; i < countSubtextures; i++) 
    { 
     offset = i * deltaOnePixel; 
     SKTexture *subTexture = [SKTexture textureWithRect:CGRectMake(offset, 0.0, 0.5, 1.0) inTexture:texture]; 
     [textureArray addObject:subTexture]; 
    } 

    return [NSArray arrayWithArray:textureArray]; 
} 

現在這仍然不是理想的,因爲它必須使圖像與手動2瓦。我們還可以使用CIFilter變換編輯SKTexture,該變換可能會用於創建具有2個圖塊的紋理。

除此之外,我認爲這個解決方案更好,因爲它不依賴於屏幕的大小,並且是高效的內存;但爲了在整個屏幕上使用它,我必須創建更多的SKSpriteNode對象,這些對象與我使用的對象共享相同的moveAction,因爲根據此來源,Sprite Kit無法進行平鋪: How do you set a texture to tile in Sprite Kit

我將嘗試更新代碼,以便使用多個SKSpriteNode對象進行平鋪。