删除后,将SKSpriteNode子项添加回父项

时间:2014-08-31 22:33:08

标签: ios objective-c sprite-kit

我正在开发一款背景中有3个云的游戏,每个云都是SKSpriteNodes。为了创建视差效果,我在角色向上移动时将它们向下移动(屏幕也向上移动)。

我在更新方法中将它们移到屏幕底部后将其删除。我想将它们添加回可视场景上方20px的Y位置,这样在iPhone 4上为500x,在iPhone 5上为588px。然后重复一遍又一遍。

然后,只有我能想到这样做的方法是链接SKActions并运行一个序列,但我不认为这是最好的方法。在更新方法中删除它们之后,我试图找到一种方法来添加它们。

  -(id)initWithSize:(CGSize)size { 

         ...

       //Moving Clouds
    [self performSelector:@selector(createClouds) withObject:nil afterDelay:.2];

  }

 -(void)createClouds {

    SKSpriteNode *cloud1 = [SKSpriteNode spriteNodeWithImageNamed:@"cloud1"];
    cloud1.position = CGPointMake(40, 200);
    cloud1.xScale = .5;
    cloud1.yScale = .5;
    cloud1.name = @"Cloud1";
    cloud1.zPosition = 0;

    SKAction *moveCloud1 = [SKAction moveToY:-20 duration:15];
    [cloud1 runAction:[SKAction repeatActionForever:moveCloud1]];

    [self addChild:cloud1];

    SKSpriteNode *cloud2 = [SKSpriteNode spriteNodeWithImageNamed:@"cloud2"];
    cloud2.position = CGPointMake(300, 320);
    cloud2.xScale = .5;
    cloud2.yScale = .5;
    cloud2.name = @"Cloud2";
    cloud2.zPosition = 0;

    SKAction *moveCloud2 = [SKAction moveToY:-40 duration:15];
   [cloud2 runAction:[SKAction repeatActionForever:moveCloud2]];

   [self addChild:cloud2];

   SKSpriteNode *cloud3 = [SKSpriteNode spriteNodeWithImageNamed:@"cloud3"];
   cloud3.position = CGPointMake(200, 450);
   cloud3.xScale = .5;
   cloud3.yScale = .5;
   cloud3.name = @"Cloud3";
   cloud3.zPosition = 0;

   SKAction *moveCloud3 = [SKAction moveToY:-200 duration:20];
  [cloud3 runAction:[SKAction repeatActionForever:moveCloud3]];

  [self addChild:cloud3];

 }

 -(void)update:(CFTimeInterval)currentTime {
     ....
    // Remove Cloud from parent
        [self enumerateChildNodesWithName:@"Cloud1" usingBlock:^(SKNode *node, BOOL *stop) {
            if (node.position.x < 0 || node.position.y < 0) {
                [node removeFromParent];
                //Add node back to the scene at a Y position above the screen then move
                // the cloud downwards again. Repeat Forever.
                // Exp:  Move Cloud 1 to X position 40, Y position 500 (20 pixels above the top of the screen for an iPhone 4s)
            }
            else {
               // Do something?
            }
        }];

2 个答案:

答案 0 :(得分:2)

您可以添加SKAction以将云移回顶部:

    SKSpriteNode *cloud1 = [SKSpriteNode spriteNodeWithImageNamed:@"cloud1"];
    cloud1.position = CGPointMake(40, 200);
    cloud1.xScale = .5;
    cloud1.yScale = .5;
    cloud1.name = @"Cloud1";
    cloud1.zPosition = 0;

    SKAction *moveCloud1 = [SKAction moveToY:-20 duration:15];
    // SKAction to move cloud back to top of screen
    SKAction *moveToTop = [SKAction moveToY:CGRectGetHeight(self.frame)+20 duration:0];
    SKAction *cloud1Action = [SKAction sequence:@[moveCloud1, moveToTop]]; 
    [cloud1 runAction:[SKAction repeatActionForever:cloud1Action]];

您不需要更新方法中的代码。

答案 1 :(得分:1)

我认为你可以简单地改变位置

另外,使用CGRectGetMinY来使用相对定位,更容易管理不同的屏幕尺寸。

并且只检查Y位置,因为如果它们垂直移动,X将不会改变。

这是我的想法:

 -(void)update:(NSTimeInterval)currentTime {

    for(int i = 1; i<=3; i++){
        NSString* cloud = [NSString stringWithFormat:@"Cloud%d",i];
        [self enumerateChildNodesWithName:cloud usingBlock:^(SKNode *node, BOOL *stop) {
            if (node.position.y < 0) {
                node.position = CGPointMake(node.position.x,CGRectGetMaxY(self.frame)+20);
            }
        }];
    }
}
相关问题