2016-08-22 8 views
0

私は自分のシーンにあるSpritNodesを持っています。私がそれをタッチするとメソッドが呼び出されます。自分のノードでisUserInteractionEnabledがtrueに設定されていますが、ノードに触れるとtouchesBeganが呼び出されません。 (注:私はスウィフト3.0を使用しています)touchesはSprit Nodeで呼び出されていません

コード:

import SpriteKit 

class MainScene: SKScene, SKPhysicsContactDelegate { 

    var didStart = false 
    var background = SKSpriteNode(imageNamed: "background") 
    var backDrop = SKShapeNode() 
    var emailNodes: [SKSpriteNode] = [] 

    let emailCatagory: UInt32 = 0x1 << 0 
    let dropCatagory: UInt32 = 0x1 << 1 

    override func sceneDidLoad() { 
     startCountDown() 
    } 

    override func didMove(to view: SKView) { 
     self.physicsWorld.contactDelegate = self 

     background.position = CGPoint(x: frame.midX, y:frame.midY) 
    } 

    public func startCountDown(){ 
     var times = 4 

     let countdownTimer = SKLabelNode() 
     countdownTimer.text = "3" 
     countdownTimer.position = CGPoint(x: frame.midX, y: frame.midY) 
     countdownTimer.fontSize = 120.0 
     countdownTimer.fontName = "Lao MN" 
     countdownTimer.fontColor = UIColor.black() 

     backDrop = SKShapeNode() 
     backDrop = SKShapeNode(rectOf: CGSize(width: frame.width, height: 100)) 
     backDrop.position = CGPoint(x: frame.midX, y: 10) 
     backDrop.physicsBody = SKPhysicsBody(rectangleOf: backDrop.frame.size) 
     //backDrop.size = CGSize(width: 1000, height: 2) 
     backDrop.physicsBody?.affectedByGravity = false 
     backDrop.physicsBody?.usesPreciseCollisionDetection = true 
     backDrop.name = "backDrop" 
     backDrop.physicsBody?.collisionBitMask = 0 
     backDrop.physicsBody?.categoryBitMask = dropCatagory 

     addChild(countdownTimer) 
     addChild(backDrop) 
     //addChild(background) 

     Timer.every(1.2.seconds) { (timer: Timer) in 
      if(times<=0){ 
       timer.invalidate() 
       countdownTimer.removeFromParent() 
       self.didStart = true 
       self.startDropping() 
      }else{ 
       print("\(times)") 
       times = times - 1 
       countdownTimer.text = "\(times)" 
      } 
     } 
    } 

    func startDropping(){ 
     Timer.every(1.2.seconds) { (timer: Timer) in 
      let which = Int(arc4random_uniform(2) + 1) 
      let ee = self.getEmailNode(type: which) 
      self.addChild(ee) 
      ee.physicsBody?.applyImpulse(CGVector(dx: 0.0, dy: -5.0)) 
     } 
    } 

    func getEmailNode(type: Int) -> SKSpriteNode{ 
     var email = SKSpriteNode() 
     if(type == 1){ 
      email = SKSpriteNode(imageNamed: "normal_email") 
      email.name = "normal_email" 
     } 
     if(type == 2){ 
      email = SKSpriteNode(imageNamed: "classified_email") 
      email.name = "classified_email" 
     } 
     email.setScale(3) 
     email.position = CGPoint(x: getRandomColumn(), y: frame.height) 
     email.physicsBody = SKPhysicsBody(rectangleOf: email.frame.size) 
     email.physicsBody?.usesPreciseCollisionDetection = true 
     email.physicsBody?.categoryBitMask = emailCatagory 
     email.isUserInteractionEnabled = true 
     email.physicsBody?.affectedByGravity = false 
     email.physicsBody?.collisionBitMask = 0 
     email.physicsBody?.contactTestBitMask = emailCatagory | dropCatagory 
     emailNodes.append(email) 
     return email 
    } 

    func getRandomColumn() -> CGFloat{ 
     let which = Int(arc4random_uniform(3) + 1) 
     let gg = frame.size.width/3 
     switch(which){ 
     case 1: 
      return gg/2 
     case 2: 
      return frame.midX 
     case 3: 
      return (gg * 3) - gg/2 
     default: 
      return (gg * 3) + gg/2 
     } 
    } 

    func didBegin(_ contact: SKPhysicsContact) { 
     if (contact.bodyA.categoryBitMask == dropCatagory) && 
      (contact.bodyB.categoryBitMask == emailCatagory) { 
      let node = contact.bodyB.node as! SKSpriteNode 
      node.removeFromParent() 
      while emailNodes.contains(node) { 
       if let itemToRemoveIndex = emailNodes.index(of: node) { 
        emailNodes.remove(at: itemToRemoveIndex) 
       } 
      } 
     } 
    } 

    func doesContainNode(sk: SKSpriteNode) -> Bool { 
     for it in emailNodes{ 
      if(it == sk){ 
       return true 
      } 
     } 
     return false 
    } 

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
     enumerateChildNodes(withName: "//*", using: 
      { (node, stop) -> Void in 
       print("\(node.name)") 
       print("\(node)") 
       if((node.name?.contains("email")) != nil){ 
        print("Touched!") 
       } 
     }) 
    } 

} 
+0

シーンの他の場所をタップするとtouchesBeganが呼び出されますか? –

+0

はいそれは – ZachtheBoB

+1

と呼ばれます。email.isUserInteractionEnabled = falseにするとうまくいくはずです。ノードがタッチイベントを受け取り、シーンにそれを通さないことを真に設定します。 –

答えて

1

をあなたは、ユーザの位置を取得し、スプライトがタッチされたときを知ることができるようにするために次のことを試してみてください。 touchesEnabled関数の中に以下を追加します。その後、

for touch in touches { 
    let userTouch = touch.locationInNode(self) 
} 

スプライトを使って、感動したかどうかを確認:

node.containsPoint(userTouch) 

それが動作するかどうかを参照してください。コードの設定方法は、上記の関数をnilかどうかをチェックした直後に入れ子にする必要があるかもしれません。 userInteractionEnabledに関しては、私は上記のコードを使用するときはまったく使用しません。

0

ノードのいずれにもuserInteractionEnabledを設定したくない場合は、そのシーンでのみ必要です。 userInteractionEnabledを使用するのは、ノードをサブクラス化するときだけです。この方法では、サブクラス化されたファイルの内部にtouchesBeganを使用できます。何が起こっているかは、あなたの接触があなたのノードに入って吸収されていることです。これは何もせず、ノードがそれを吸収してからシーンによって無視されています。

編集:申し訳ありません@MarkBrownswordあなたのコメントが表示されませんでした。あなたが回答として投稿した場合、アップして回答を削除します。

1

解決策が見つかりました。私はisUserInteractionEnabledを削除し、まだtouchesBeganは呼び出されていませんでした。だから、私は "電子メール"ノードの各プロパティを調べて、何らかの理由で次のプロパティを作りました。touchesBeganは呼び出されませんでした。

email.physicsBody?.affectedByGravity = false 
email.physicsBody?.collisionBitMask = 0 

私はこれらを削除しましたので、今すぐtouchesBeganが正しく呼び出されています。

関連する問題