2014-08-31 2 views
0

각 SKSpriteNodes 인 배경에 3 개의 구름이있는 게임에서 작업하고 있습니다. 시차 효과를 만들기 위해 나는 캐릭터가 위로 움직이는 것처럼 화면 아래로 움직일 것입니다. (화면도 위로 움직이고 있습니다).제거한 후 SKSpriteNode 자식을 부모에게 다시 추가합니다.

업데이트 방법에서 화면 하단에 도달하면 제거합니다. 아이폰 4에서 500 배, 아이폰 5에서 588 픽셀이되도록 시야에서 20 배 이상의 Y 위치에 다시 추가하고 싶습니다. 그런 다음 반복해서 반복하십시오.

다음은 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

위로 가기 클라우드로 이동하는 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]]; 

업데이트 방법에 코드가 필요하지 않습니다

이 내 생각이다.

+0

이것으로 끝내 잘되었습니다! 왜 내가 이런 식으로하는 것에 반대하는지 모르겠다. – Paul

1

난 당신이 간단하게, 또한 위치

을 변경 다른 화면 크기를 쉽게 관리 할 상대 위치를 사용하는 CGRectGetMinY를 사용할 수 있다고 생각합니다.

세로로 움직이는 경우 X가 변경되지 않기 때문에 Y 위치 만 확인하십시오.

-(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); 
      } 
     }]; 
    } 
} 
+0

당신의 대답은 효과가있는 것처럼 보이지만 그렇지 않습니다. 나는 node.position = CGPointMake (node.position.x, CGRectGetMaxY (self.frame) +20);'뒤에 NSLog 문을 추가했으나 콘솔에서 실행되지 않습니다. – Paul

+0

그리고 NSLog를 업데이트 메서드의 시작 부분에 놓으면 호출됩니까? – Draelach

+0

예, 업데이트 방법의 시작 부분에 NSLog를 넣었지만 호출되었지만 구름이 움직이지 않았습니다. 어쨌든 도움을 주셔서 감사합니다. – Paul

관련 문제