2014-01-10 7 views
2

나는 화면보다 컨베이어 벨트 이미지를 더 만들 수 다음으로 영원히 반복해서 움직일 것입니다 그래서SpriteKit 컨베이어 벨트

Screenshot

처음으로 반사처럼 SpriteKit를 사용하여 컨베이어 벨트 효과를 만들려고하고 있어요 행위. 하지만 이것은 화면 크기에 의존하기 때문에 괜찮은 것 같지 않습니다.

더 좋은 방법이 있습니까?

또한 분명히 컨베이어 벨트에 물건 (독립적으로 움직일 것)을 넣어 노드가 움직이는 자식 스프라이트 노드가있는 SKNode가되도록하고 싶습니다.

업데이트 : 컨베이어 벨트가 "시각적으로"움직 이길 바랍니다. 그래서 선은 움직임의 느낌을주는 방향으로 움직입니다.

답변

2

을 컨베이어 벨트 위로 이동하고 affectedByGravity 속성을 NO로 설정해야하는 모든 스프라이트에 적용하십시오.

이 예제에서는 컨베이어 벨트를 나타내는 spriteNode가 conveyor이라고 가정합니다. 또한 이동해야하는 모든 스프라이트 노드에는 name 속성으로 "moveable"이라는 문자열이 있습니다.

그런 다음 -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 extidth'를'x = 0'으로 옮겨서 반복합니다. – DarkDust

0

@akashg, 나는 컨베이어 벨트 모양을 만드는 방법으로 내 대답을 제공하고있는 컨베이어 벨트를 통해 움직이는 물체에 대한 해결책을 지적하고 내 최초의 직관 배치했다 장면의 화면보다 큰 직사각형을 지정하고 반복적으로 이동합니다. 반영하자면, 이것은 좋은 해결책이 아니라고 생각합니다. 중간에 컨베이어 벨트를 놓고 싶다면 두 가지 방법으로 끝나는 것을 볼 수 있기 때문에 여분의 클리핑 마스크 없이는 불가능합니다.

SKSpriteNodeSKTexture을 타일링하고이 텍스처를 오프셋하는 것이 가장 이상적인 해결책입니다. 그러나 이것은 Sprite Kit (타일 메커니즘 없음)에서 가능하지는 않습니다.

기본적으로 내가하고있는 일은 [타일] 타일 (반복 가능한 타일의 2 배)와 같은 텍스처에서 하위 텍스처를 만드는 것입니다. 그리고 애니메이션을 생성하기 위해이 서브 텍스처를 차례로 보여줍니다. 수동 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을 편집 할 수도 있습니다.

이 외에도이 솔루션은 화면 크기에 의존하지 않고 메모리가 효율적이기 때문에 더 좋다고 생각합니다. 하지만 전체 화면에서 사용하기 위해서는 더 많은 SKSpriteNode 개체를 만들어야합니다. moveAction을 사용합니다. 타일링은이 소스에 따라 Sprite Kit에서 가능하지 않으므로 How do you set a texture to tile in Sprite Kit입니다.

여러 SKSpriteNode 개체를 사용하여 바둑판 식으로 배열 할 수 있도록 코드를 업데이트하려고합니다.

관련 문제