首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >删除后将SKSpriteNode子元素添加回父级

删除后将SKSpriteNode子元素添加回父级
EN

Stack Overflow用户
提问于 2014-08-31 22:33:07
回答 2查看 562关注 0票数 0

我正在做一个游戏,里面有三个云,每个云都是SKSpriteNodes。为了创造一个视差效果,我把它们向下移动,因为角色在向上移动(屏幕也在向上移动)。

在它们到达屏幕底部后,我在update方法中删除它们。我想把他们加回到一个Y位置20 at以上的可视场景,这将是500倍在一个iPhone 4和588 at在一个iPhone 5,然后只是重复一遍又一遍。

那么,我唯一能想到的方法就是连锁SKActions并运行一个序列,但我不认为这是最好的方法。在update方法中删除它们之后,我试图找到一种方法来添加它们。

代码语言:javascript
运行
复制
  -(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?
            }
        }];
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-09-01 06:23:03

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

代码语言:javascript
运行
复制
    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]];

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

票数 2
EN

Stack Overflow用户

发布于 2014-08-31 23:46:54

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

此外,使用CGRectGetMinY使用相对定位,更容易管理不同的屏幕大小。

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

这是我的主意:

代码语言:javascript
运行
复制
 -(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);
            }
        }];
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25596900

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档