2017-01-11 17 views
4

에 대한이 내 문제입니다 그러나 hitTest. 내가 어떻게하고 싶은지는 "hitTestWithEventUIView"으로 대체하는 것과 같습니다. 그러나 SKSpriteNode에 대해 이벤트를 무시하고 touchesBegan을 호출하지 못하는 비슷한 방법을 찾을 수 없습니다.는 SKSpriteNode

  • 내가 false로 isUserInteractionEnabled을 설정할 수 있지만 전체 스프라이트 아니라 일부를 비활성화 물론

    .

  • touchesBegan 메서드에서 터치 위치를 확인할 수 있지만 늦은 것입니다. 동일한 위치의 아래에있는 다른 스프라이트는 더 이상이 이벤트를받지 않습니다.
  • 또한 SKCropNode을 사용해 보았지만 스프라이트 표시를 방지하고 보이지 않는 영역에서도 이벤트를 처리합니다.

아무도 어떻게 스프라이트의 일부를 막는 지 알지 못합니까? 이벤트를 처리하지 못합니까?

답변

1

open func nodes(at p: CGPoint) -> [SKNode]은 어느 노드를 터치했는지 감지하는 데 유용합니다. 그 후, 당신은 당신이 원하는 각 노드에 대한 CGRect 영역 ..

import SpriteKit 
class GameScene: SKScene { 
    var warningZone = CGRect(x: -80, y: -60, width: 100, height: 100) 
    override func didMove(to view: SKView) { 
     let nodeRed = SKSpriteNode.init(color: .red, size: CGSize(width:300,height:200)) 
     nodeRed.name = "nodeRed" 
     addChild(nodeRed) 
     nodeRed.position = CGPoint(x:self.frame.midX,y:self.frame.midY) 
     let nodeBlue = SKSpriteNode.init(color: .blue, size: CGSize(width:300,height:200)) 
     nodeBlue.name = "nodeBlue" 
     addChild(nodeBlue) 
     nodeBlue.position = CGPoint(x:self.frame.midX+100,y:self.frame.midY+20) 
    } 
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
     for touch in touches { 
      let location = touch.location(in: self) 
      let nodesTouched = self.nodes(at: location) 
      for node in nodesTouched { 
       guard let n = node.name else { return } 
       print("Node touched: \(node.name) at point:\(location)") 
       switch n { 
       case "nodeRed": 
        // do your exclusions for the nodeRed 
        print("\(node.frame)") 
        if !warningZone.contains(location) { 
         print("you have touch a safe red zone") 
        } 
       case "nodeBlue": 
        // do your exclusions for the nodeBlue 
        print("\(node.frame)") 
       default: 
        break 
       } 
      } 
     } 
    } 
} 

출력을 제외 할 수 있습니다 (내가 여기서 만 보여 흰색 사각형과 warningZone을 그릴했습니다 ..) : enter image description here

+0

답장을 보내 주셔서 감사합니다.하지만 이것은 제가 찾고자하는 해결책의 아주 장난 꾸러기 해결 방법이라고 생각합니다. 이 접근법은 수동으로 장면의 모든 스크립트를 확인해야합니다 : (수십 또는 스프라이트의 hundrets와 상상해보십시오 - 얼마나 지저분한이 스위치가 될 것입니다. 당신이 특정 스프라이트의 사용자 상호 작용을 활성화하고 그것을 히트 테스트 방법을 무시할 수있는 솔루션을 찾고 있는데요. 이 접근법은 SKSpriteNode를 서브 클래스 화하고 서브 클래스 정의 내의 서브 클래스 유형에 적절하게 접촉을 처리 할 수있게합니다. – ukaszm

+0

글쎄, 당신이 제안한 것은 당신이 당신이 접촉하기를 원하는 노드를 직접적으로 알지 못하는 노드를 만질 수 있기 때문입니다 하위 클래스 내부에 있거나 부모 노드를 알고 있지만 부모 노드가 올바른 노드를 알지 못하는 것입니다. 즉, 힙을 촬영하면 모든 힙을 알아야합니다.이 경우의 터치는 총알과 같습니다. –