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을 그릴했습니다 ..) :
를
답장을 보내 주셔서 감사합니다.하지만 이것은 제가 찾고자하는 해결책의 아주 장난 꾸러기 해결 방법이라고 생각합니다. 이 접근법은 수동으로 장면의 모든 스크립트를 확인해야합니다 : (수십 또는 스프라이트의 hundrets와 상상해보십시오 - 얼마나 지저분한이 스위치가 될 것입니다. 당신이 특정 스프라이트의 사용자 상호 작용을 활성화하고 그것을 히트 테스트 방법을 무시할 수있는 솔루션을 찾고 있는데요. 이 접근법은 SKSpriteNode를 서브 클래스 화하고 서브 클래스 정의 내의 서브 클래스 유형에 적절하게 접촉을 처리 할 수있게합니다. – ukaszm
글쎄, 당신이 제안한 것은 당신이 당신이 접촉하기를 원하는 노드를 직접적으로 알지 못하는 노드를 만질 수 있기 때문입니다 하위 클래스 내부에 있거나 부모 노드를 알고 있지만 부모 노드가 올바른 노드를 알지 못하는 것입니다. 즉, 힙을 촬영하면 모든 힙을 알아야합니다.이 경우의 터치는 총알과 같습니다. –