2014-04-11 5 views
4

그래서 타워 방어 게임을 만들고 타워 보드를 작동시켜 타워를 배치 할 수 있습니다.SpriteKit의 노드를 통해 터치하십시오.

플레이어가 그리드 위의 버튼을 클릭하면 타워 배치를 토글하여 플레이어가 그리드 내의 셀에 타워를 배치 할 수있게합니다. 그러나 각 타워는 발사 범위로 움직이는 크립 감지를 처리하기 위해 주변에 원형 ShapeNode를 가져옵니다. 이 쉐이프 노드는 일단 배치하면 타워 주변을 잘 볼 수 있습니다.

내가 타워를 배치하는 데 사용한 논리는 사용자가 만지는 노드 ("셀")를 찾아 타워 노드로 바꾼다는 것입니다. 그러나 타워 노드에 연결된 원 노드가 있고 그 옆에있는 셀을 덮고 있다면 원 아래의 셀 노드를 선택할 수 없습니다.

원을 "관통"하거나 채우기 공간을 아무 것도 설정하지 않고 그 아래의 셀에 액세스 할 수있는 방법은 무엇입니까?

나는 여전히 스프라이트 키트를 배우고있다. 그래서 간단한 접근법이 나에게 올바른 방향으로 나를 가리키게 할 수 있다면.

+0

서클 노드에 대해 userInteractionEnabled 속성을 false로 설정 했습니까? 이 값을 변경하지 않았다면 기본적으로 false 여야합니다. false 인 경우, 그 노드는 건 드리면 안됩니다. – nacross

+0

이 기능은 더 이상 원 노드를 선택할 수 없기 때문에 작동하지만, 맨 위에 계층화 된 노드이기 때문에 비활성화 된 노드 아래에서 사용자가 선택할 수없는 문제를 제거하지는 않습니다. – Klutch

답변

3

관련 코드를 보지 않고도 확실하게 말할 수는 있지만 설명을 통해서는 문제가 모양 노드와 관련이 있다고 생각합니다. 셰이프 노드를 사용하여 연락처를 처리하는 대신 타워의 물리 본문을 사용하는 것이 좋습니다. 완전히 새로운 노드를 추가하지 않고도 타워의 원형 물리학 몸체를 가질 수 있습니다. 도형 노드를 제거하면 교차 터치 간섭이 해결됩니다.

+0

나는 이것이 내가 찾고있는 해결책일지도 모른다고 생각하고 있었지만, 플레이어에게 육체의 시체를 보이도록 만들 수 있습니다. 타워에서 발사 할 반지름을 볼 수 있기를 바랍니다. – Klutch

+1

일을 단순하게하기 위해 몇 가지 평범한 SKSpriteNodes를 사용할 것을 고려해 볼 수 있습니다. 각자 다른 크기의 원형 이미지를 가질 수 있습니다 (물론 알파 설정). zPosition을 다른 터치 항목과 간섭하지 않도록 충분히 낮게 만드십시오. – sangony

+0

나는 당신의 아이디어와 도움이 마음에 들었습니다. 그리드 위에 겹쳐있는 스프라이트로 놀아야한다. get이 잘못된 생각처럼 들리지 않는 한, 사용자가 타워를 선택할 때마다 circle 스프라이트 노드를 만들고 파괴하려고 생각했기 때문에 화면에 한 번만 표시되고 보이지 않는 경우는 표시되지 않습니다. 너는 나타나라고 말한다. – Klutch

4

주어진 노드에서 반드시 가장 깊은 노드 일 필요는 없지만 SKScene을 포함한 SKNode에서 사용할 수있는 nodesAtPoint:을 사용할 수 있습니다.

이렇게하면 장면의 모든 하위 노드 또는 주어진 지점과 교차하는 노드를 찾을 수 있습니다. 그런 다음 노드 클래스 또는 노드 이름에 따라 배열을 필터링하여 원하는 특정 노드를 찾으려면이를 더 필터링 할 수 있습니다.

유사한 접근 방식

적용 할 수 SKPhysicsWorld에서 사용할 수있는 방법 enumerateBodiesAtPoint:usingBlock:

nodesAtPoint를 사용하는 경우 협조 할 것이다 사용, 특정 지점에서 물리 기관을 찾는 경우 :에게 포인트가 호출 노드 좌표됩니다 시스템의 경우 으로 enumerateBodiesAtPoint : usingBlock :은 항상 장면 좌표계에 있습니다.

+0

이것은 굉장하고 매력처럼 작동합니다. 필자는 SpriteKit을 처음 접했을 때부터 일부 벤치 마크에 대해 궁금해했습니다. 이것은 탑 배치와 뷰 로직을 작성하는 방법에 대한 나의 첫 번째 아이디어 였지만 더 많은 것들이 장면에 추가됨에 따라 꾸준히 지연되기 시작한다는 것을 알 수 있습니다. – Klutch

+0

안녕하세요. @nacross, 내 질문을 살펴볼 수 있습니까? enumarateBodiesAtPoint와 비슷한 문제가 있습니다. 현상금은 4 일 안에 끝납니다. 나는 모든 enumerateBodiesAt 메서드를 시도하고 모두 매우 부정확하고 왜 모르겠어요 http://stackoverflow.com/questions/24851309/get-a-list-of-nodes-in-an-specific-area – lisovaccaro

+0

안녕하세요 @ lisovaccaro, 저에게는 저에게 버그가 있다고 생각합니다. 저는이 기능이 과거에는 제대로 작동했지만 최근에 새로운 게임에서 같은 기능을 사용하려고 시도하고 문제가 있음을 확신했습니다. 이 문제를 겪고있는 사람이 여러 명있는 것 같습니다. 내 의견을 볼 수 있습니다 : https://devforums.apple.com/message/1003884#1003884 – nacross

0

TouchesBegan은 자동으로 해당 위치의 모든 노드를 감지하므로 루프를 반복하면됩니다.

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    for (UITouch *touch in touches) 
    { 
     CGPoint touchPoint = [touch locationInNode:self]; 
     NSArray *nodes = [self nodesAtPoint:touchPoint]; 

     if ([nodes count]) 
     { 
      for (SKNode *node in nodes) 
      { 
       if ([node.name isEqualToString:@"cell"]) 
       { 

       } 
       else 
       { 

       } 
      } 
     } 
    } 
} 

"self"는 접촉을 시작한 노드가 호출됩니다 (가장 가능성있는 장면). 예를 들어 상위 개체로 필터링 할 수도 있습니다. 모든 노드를 "background"라는 부모 노드에 추가하면 "self"를 배경 노드로 바꾸면 백그라운드 노드의 자식 만 필터링 할 수 있습니다 (배경 노드 좌표를 사용하게 됨).

+0

타워 노드가 SKSpriteNode의 하위 클래스 인 경우에는 작동하지 않습니다 – Relequestual

관련 문제