2014-09-08 4 views
0

나는 적은 SpriteKit 게임을 만들어 적들이 UIBezierPath를 따르고 있습니다. (다른 방법으로이 작업을 수행 할 수 있습니까? 매우 비생산적인 것 같습니다)왜 UIBezierPath는 이와 같이 동작합니까?

어쨌든 내 적의 행동은 매우 이상합니다. 여기에 (300)의 직경 간단한 원에 대한 코드는 다음과 같습니다

이제
enemy.position = CGPointMake(0, 0); 

    UIBezierPath* circlePath = [UIBezierPath bezierPathWithOvalInRect: CGRectMake(0, 0, 300, 300)]; 

    CGPathRef pathRef = [cicrlePath CGPath]; 


    SKAction *followPath = [SKAction followPath:pathRef 
             asOffset:NO 
            orientToPath:NO 
             duration: pathSpeed]; 




    SKAction *forever = [SKAction repeatActionForever:followPath]; 


    [enemy runAction:forever]; 

내가 적 위치와 (0,0)에서 circlePath 위치를 지정하는 방법을 참조? 이 탈출구 장소이기 때문에 정말 감각을 아니에요 http://www.gfycat.com/DistinctSnarlingAracari

, 내 생각 :

은 어떻게 든 그것은 나에게이 결과를주고? 또는 나는 무엇인가 놓치고 있냐?

아, 내가 전에 언급 한 것처럼, 어떻게하면 게임의 적의 움직임을 가장 효율적/생산적인 방법으로 할 수 있습니까? 현재 UIBeziers와 PaintCode를 사용하고 있지만 항상 이상한 결과를줍니다. 귀하의 답변을 기다리고 있습니다.

+0

GIF에서 정확히 무엇이 잘못 되었습니까? "1"아이콘이 잘못된 위치에 있다고 생각하면 어디에서 예상됩니까? –

+0

Sprite Kit 장면의 기본 앵커 포인트는 왼쪽 하단에 있습니다 (https://developer.apple.com/library/ios/documentation/GraphicsAnimation/Conceptual/SpriteKit_PG/Nodes/Nodes.html 참조). #// apple_ref/doc/uid/TP40013043-CH3-SW19) 왼쪽 하단에만 1이 보이기를 기대합니다. 편집 : 방금 실수를 깨달았습니다. BezierPath의 중심을 사용할 것이라고 생각했습니다. 그것의 경로를 위치로 .. –

답변

1

-[UIBezierPath bezierPathWithOvalInRect:] 또는 아마도 CGRectMake을 이해할 수 없습니다. 0, 0은 가운데가 아닌 타원의 경계 상자의 왼쪽 위 모서리이며, 300, 300은 경계 상자의 너비와 높이입니다. 당신이 타원형이 0, 0 중심 싶은 경우,이 시도 :

UIBezierPath* circlePath = [UIBezierPath bezierPathWithOvalInRect: 
    CGRectMake(-150, -150, 300, 300)]; 
+0

예, 이제 이해가됩니다. 그러나 내 게임의 적의 길을 만드는 더 좋은 방법을 알고 있습니까? 내가 지금하고있는 것처럼 번거롭지 않은 것 같습니다. –

+0

게임 개발 도구에 대한 경험이 거의 없습니다. –

+1

"번거 로움"은 무엇을 의미합니까?그것은 단지 모호하고, 까다 롭고, 무의미한 의견 일뿐입니다. – matt

1

UIBezier 타원형 경로의 중심 (X + 폭/2, Y + 높이/2)에 있습니다. 각도 = 0 (타원의 맨 오른쪽 점, 즉 (x + width, y + height/2))부터 시작하여 타원은 장면 좌표에서 반 시계 방향으로 그려집니다. 따라서 스프라이트는 패스가 그려지는 방향과 동일한 방향으로 이동하기 때문에 반 시계 방향으로 타원형 패스를 따라갑니다.

이 방법은 지정된 CGRect의 위치 (원점)에서 중앙에 타원형 경로를 만듭니다

은 여기에 유용 할 수 있습니다 코드입니다.

- (CGPathRef) ovalInRect:(CGRect)rect 
{ 
    CGFloat width = rect.size.width; 
    CGFloat height = rect.size.height; 
    CGFloat x = rect.origin.x-rect.size.width/2; 
    CGFloat y = rect.origin.y-rect.size.height/2; 

    return[UIBezierPath bezierPathWithOvalInRect: CGRectMake(x, y, width, height)].CGPath; 
} 

이 메서드는 노드를 순환 경로를 따라 이동하는 SKAction을 만듭니다. 매개 변수 은 경로의 중심, 반지름 및 방향 (예 : 시계 방향 및 시계 반대 방향 = 반대 방향)을 지정합니다.

- (SKAction *) createCircularPathActionAtLocation:(CGPoint)center 
             withRadius:(CGFloat)radius 
            andDirectionCW:(BOOL)directionCW 

{ 
    CGRect rect = CGRectMake(center.x, center.y, radius*2, radius*2); 
    CGPathRef ovalPath = [self ovalInRect:rect]; 
    SKAction *circlePathAction = [SKAction followPath:ovalPath asOffset:NO orientToPath:YES duration:5]; 
    SKAction *action; 

    if (directionCW) { 
     // Reverse the action to follow the path in the opposite direction 
     action = [SKAction repeatActionForever:[circlePathAction reversedAction]]; 
    } 
    else { 
     action = [SKAction repeatActionForever:circlePathAction]; 
    } 
    return action; 
} 

사이드 노트 : PaintCode 2를 사용하는 경우 절대 값 대신 변수를 사용하여 코드를 일반화 할 수 있습니다.

+0

설명해 주셔서 감사합니다. 당신은 PaintCode 2가 변수를 사용하여 코드를 일반화 할 수 있다고 언급했는데, 이는 절대 값을 사용하는 것과 어떻게 다르고이 옵션을 어디에서 찾을 수 있습니까? –

+0

이미지의 왼쪽에있는 패널의 마지막 항목입니다. – 0x141E