单次触摸同时使用两个精灵对象?

时间:2017-02-12 01:56:42

标签: ios swift sprite-kit

目前,我一次只能使用一个,并且当每个手指使用不同的手指动作时,不能使两个拨片(屏幕两侧各一个)独立行动。这是班级。有什么想法吗?

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.")
        }
    }


}

1 个答案:

答案 0 :(得分: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)
        }
    }
}