2017-02-12 10 views
0

В настоящее время я могу использовать только один за раз, а не делать два весла (по одному с каждой стороны экрана) независимо друг от друга, когда с каждым из них используются разные движения пальцев. Вот класс. Есть идеи?использовать два спрайт-объекта одновременно с одним касанием?

let BallCategoryName = "ball" 

let GameMessageName = "gameMessage" 

let BallCategory : UInt32 = 0x1 << 0 

let LeftCategory : UInt32 = 0x1 << 1 
let BlockCategory : UInt32 = 0x1 << 2 
let PaddleCategory : UInt32 = 0x1 << 3 
let BorderCategory : UInt32 = 0x1 << 4 

class GameScene: SKScene, SKPhysicsContactDelegate { 

    var isFingerOnPaddleL = false 
    var isFingerOnPaddleR = false 

    override func didMove(to view: SKView) { 
    super.didMove(to: view) 

    let borderBody = SKPhysicsBody(edgeLoopFrom: self.frame) 

    borderBody.friction = 0 
    self.physicsBody = borderBody 

    physicsWorld.gravity = CGVector(dx: 0.0, dy: 0.0) 
    physicsWorld.contactDelegate = self 

    let ball = childNode(withName: BallCategoryName) as! SKSpriteNode 
    ball.physicsBody!.applyImpulse(CGVector(dx: 2.0, dy: -2.0)) 


    let paddleL = childNode(withName: "paddleL") as! SKSpriteNode 
    //let paddleR = childNode(withName: "paddleR") as! SKSpriteNode 

    let leftRect = CGRect(x: frame.origin.x, y: frame.origin.y, width: 1, height: frame.size.height) 
    let left = SKNode() 
    left.physicsBody = SKPhysicsBody(edgeLoopFrom: leftRect) 
    addChild(left) 

    left.physicsBody!.categoryBitMask = LeftCategory 
    ball.physicsBody!.categoryBitMask = BallCategory 
    paddleL.physicsBody!.categoryBitMask = PaddleCategory 
    borderBody.categoryBitMask = BorderCategory 

    ball.physicsBody!.contactTestBitMask = LeftCategory 

    } 

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
     let touch = touches.first 
     let touchLocation = touch!.location(in: self) 

     if let body = physicsWorld.body(at: touchLocation) { 
      if body.node!.name == "paddleL" { 
       print("Began touch on paddleL") 
       isFingerOnPaddleL = true 
      } 
      else if body.node!.name == "paddleR" { 
       print("Began touch on paddleR") 
       isFingerOnPaddleR = true 
      } 
     } 
    } 

    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { 
     // 1 
     if isFingerOnPaddleL { 
      // 2 
      let touch = touches.first 
      let touchLocation = touch!.location(in: self) 
      let previousLocation = touch!.previousLocation(in: self) 
      // 3 
      let paddle = childNode(withName: "paddleL") as! SKSpriteNode 
      // 4 
      var paddleY = paddle.position.y + (touchLocation.y - previousLocation.y) 
      // 5 
      paddleY = max(paddle.size.height/2, paddleY) 
      paddleY = min(size.height - paddle.size.height/2, paddleY) 
      // 6 
      paddle.position = CGPoint(x: paddle.position.x, y: paddleY) 
     } 

     else if isFingerOnPaddleR { 
      // 2 
      let touch = touches.first 
      let touchLocation = touch!.location(in: self) 
      let previousLocation = touch!.previousLocation(in: self) 
      // 3 
      let paddle = childNode(withName: "paddleR") as! SKSpriteNode 
      // 4 
      var paddleY = paddle.position.y + (touchLocation.y - previousLocation.y) 
      // 5 
      paddleY = max(paddle.size.height/2, paddleY) 
      paddleY = min(size.height - paddle.size.height/2, paddleY) 
      // 6 
      paddle.position = CGPoint(x: paddle.position.x, y: paddleY) 
     } 

    } 

    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) { 
     if (isFingerOnPaddleL == true) { 
      isFingerOnPaddleL = false 
     } 

     else if (isFingerOnPaddleR == true) { 
      isFingerOnPaddleR = false 
     } 
    } 

    func didBegin(_ contact: SKPhysicsContact) { 
     // 1 
     var firstBody: SKPhysicsBody 
     var secondBody: SKPhysicsBody 
     // 2 
     if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask { 
      firstBody = contact.bodyA 
      secondBody = contact.bodyB 
     } else { 
      firstBody = contact.bodyB 
      secondBody = contact.bodyA 
     } 
     // 3 
     if firstBody.categoryBitMask == BallCategory && secondBody.categoryBitMask == LeftCategory { 
      print("Hit left. First contact has been made.") 
     } 
    } 


} 

ответ

0

Вы можете обрабатывать весла самостоятельно, отслеживая каждое касание на протяжении всего жизненного цикла (начато/перемещено/завершено). Во-первых, определить словарь с сенсорным объекта в качестве ключа и имени узла в качестве значения

var touchTracker:[UITouch:String] = [:] 

затем в touchesBegan, сохранить имя лопаткой (ы) прикоснулся пользователем

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
    for touch in touches { 
     let touchLocation = touch.location(in: self) 
     let node = atPoint(touchLocation) 
     if let name = node.name { 
      if name == "paddleL" { 
       print("Began touch on paddleL") 
       touchTracker[touch] = name 
      } 
      else if name == "paddleR" { 
       print("Began touch on paddleR") 
       touchTracker[touch] = name 
      } 
     } 
    } 
} 

В touchesMoved, используйте сенсорный объект для извлечения имени узла из словаря и используйте его для доступа к соответствующему весло.

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { 
    for touch in touches { 
     let touchLocation = touch.location(in: self) 
     if let name = touchTracker[touch] { 
      if let paddle = childNode(withName: name) as? SKSpriteNode { 
       // Move a paddle 
       paddle.position = CGPoint(x:paddle.position.x, y:touchLocation.y) 
      } 
     } 
    } 
} 

Наконец, удалите касание/имя из словаря при окончании касания.

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) { 
    for touch in touches { 
     if touchTracker[touch] != nil { 
      touchTracker.removeValue(forKey: touch) 
     } 
    } 
} 
+0

Я реализовал этот код, но весла все еще перемещаются вместе, когда оба нажаты. – Shekar

+0

См. Мой обновленный ответ – 0x141E

+0

Работает отлично! благодаря – Shekar

 Смежные вопросы

  • Нет связанных вопросов^_^