Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 快速多点触控对象_Swift_Ios8_Multi Touch - Fatal编程技术网

Swift 快速多点触控对象

Swift 快速多点触控对象,swift,ios8,multi-touch,Swift,Ios8,Multi Touch,这是我在斯威夫特的第一场比赛。我想用SpriteKit做一个更高级的突破游戏,就像这样 我想创建4个桨并用4个手指分别移动它们,我尝试过这样做,但当我移动一个桨时,第二个也会移动。。。我能做什么 import SpriteKit import AVFoundation class GameScene: SKScene { var fingerIsOnPaddle1 = false var fingerIsOnPaddle2 = false var fingerISOn

这是我在斯威夫特的第一场比赛。我想用SpriteKit做一个更高级的突破游戏,就像这样

我想创建4个桨并用4个手指分别移动它们,我尝试过这样做,但当我移动一个桨时,第二个也会移动。。。我能做什么

import SpriteKit
import AVFoundation

class GameScene: SKScene {

    var fingerIsOnPaddle1 = false
    var fingerIsOnPaddle2 = false
    var fingerISOnPaddle3 = false
    var fingerIsOnPaddle4 = false

    let shurikenCategoryName = "shuriken"
    let paddleCategoryName = "paddle"
    let paddle2CategoryName = "paddle2"
    let paddle3CategoryName = "paddle3"
    let paddle4CategoryName = "paddle4"
    let brickCategoryName = "brick"

    let backgroundMusicPlayer = AVAudioPlayer()

    override init(size: CGSize){
        super.init(size: size)

        let bgMusicURL = NSBundle.mainBundle().URLForResource("bgMusicMP3", withExtension: "mp3")

        backgroundMusicPlayer = AVAudioPlayer(contentsOfURL: bgMusicURL, error: nil)
        backgroundMusicPlayer.numberOfLoops = -1
        backgroundMusicPlayer.prepareToPlay()
        backgroundMusicPlayer.play()

        let backgroundImage = SKSpriteNode(imageNamed: "bg")
        backgroundImage.position = CGPointMake(self.frame.size.width / 2, self.frame.size.height / 3)
        self.addChild(backgroundImage)

        self.physicsWorld.gravity = CGVectorMake(0, 0)

        let worldBorder = SKPhysicsBody(edgeLoopFromRect: self.frame)
        self.physicsBody = worldBorder
        self.physicsBody?.friction = 0

        let shuriken = SKSpriteNode(imageNamed: "shuriken")
        shuriken.name = shurikenCategoryName
        shuriken.position = CGPointMake(self.frame.size.width/2, self.frame.size.height / 2)
        self.addChild(shuriken)

        shuriken.physicsBody = SKPhysicsBody(circleOfRadius: shuriken.frame.width / 2)
        shuriken.physicsBody?.friction = 0
        shuriken.physicsBody?.restitution = 1
        shuriken.physicsBody?.linearDamping = 0
        shuriken.physicsBody?.applyImpulse(CGVectorMake(2, 2))
        shuriken.physicsBody?.allowsRotation = true

        let paddle = SKSpriteNode(imageNamed: "paddle")
        paddle.name = paddleCategoryName
        paddle.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame)/4)
        self.addChild(paddle)

        paddle.physicsBody = SKPhysicsBody(rectangleOfSize: paddle.frame.size)
        paddle.physicsBody?.friction = 0.4
        paddle.physicsBody?.restitution = 0.1
        paddle.physicsBody?.dynamic = false

       //paddle.position = CGPointMake(CGRectGetMidX(self.frame)/2, CGRectGetMidY(self.frame)/4)
       //self.addChild(paddle)



        let paddle2 = SKSpriteNode(imageNamed: "paddle")
        paddle2.name = paddle2CategoryName
        paddle2.position = CGPointMake(CGRectGetMidX(self.frame)/5, CGRectGetMidY(self.frame))
        paddle2.zRotation = CGFloat(M_PI_2)
        self.addChild(paddle2)
        paddle2.physicsBody = SKPhysicsBody(rectangleOfSize: paddle.frame.size)
        paddle2.physicsBody?.friction = 0.4
        paddle2.physicsBody?.restitution = 0.1
        paddle2.physicsBody?.dynamic = false

        let paddle3 = SKSpriteNode(imageNamed: "paddle")
        paddle3.name = paddle2CategoryName
        paddle3.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame)/4*7)
        self.addChild(paddle3)

        let paddle4 = SKSpriteNode(imageNamed: "paddle")
        paddle4.name = paddle2CategoryName
        paddle4.position = CGPointMake(CGRectGetMidX(self.frame)/5*9, CGRectGetMidY(self.frame))
        paddle4.zRotation = CGFloat(M_PI_2)
        self.addChild(paddle4)        

   }

   override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
        let touch = touches.anyObject() as UITouch
        let touchLocation = touch.locationInNode(self)

        let body:SKPhysicsBody? = self.physicsWorld.bodyAtPoint(touchLocation)

        if body?.node?.name == paddleCategoryName {
           println("Paddle 1 touched")
           fingerIsOnPaddle1 = true
        }

        if body?.node?.name == paddle2CategoryName{
           println("Paddle 2 touched")
           fingerIsOnPaddle2 = true
        }
   }

   override func touchesMoved(touches: NSSet, withEvent event: UIEvent) {
       if fingerIsOnPaddle1{
           let touch = touches.anyObject() as UITouch
           let touchLoc = touch.locationInNode(self)
           let prevTouchLoc = touch.previousLocationInNode(self)

           let paddle = self.childNodeWithName(paddleCategoryName) as SKSpriteNode

           var newXPos = paddle.position.x + (touchLoc.x - prevTouchLoc.x)

           paddle.position = CGPointMake(newXPos, paddle.position.y)
    }

    if fingerIsOnPaddle2{
        let touch2 = touches.anyObject() as UITouch
        let touchLoc2 = touch2.locationInNode(self)
        let prevTouchLoc2 = touch2.previousLocationInNode(self)

        let paddle2 = self.childNodeWithName(paddle2CategoryName) as SKSpriteNode

        var newYPos = paddle2.position.y + (touchLoc2.y - prevTouchLoc2.y)

        paddle2.position = CGPointMake(paddle2.position.y, newYPos)
     }

   }

   override func touchesEnded(touches: NSSet, withEvent event: UIEvent) {


   }

   required init?(coder aDecoder: NSCoder){
       super.init(coder: aDecoder)
   }
}

这里问题的关键在于touchesbeated函数,它需要一组触摸。这是一种非常常见的模式,只使用第一个模式,使用任意对象,但不必这样做,您可以在其上循环,如下所示:

   override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
        for touch in touches as? UITouch {
            let touchLocation = touch.locationInNode(self)

            let body:SKPhysicsBody? = self.physicsWorld.bodyAtPoint(touchLocation)

            if body?.node?.name == paddleCategoryName {
                println("Paddle 1 touched")
                fingerIsOnPaddle1 = true
            }

            if body?.node?.name == paddle2CategoryName{
                println("Paddle 2 touched")
                fingerIsOnPaddle2 = true
            }
        }
   }

我要做的是制作一个定制的桨类,然后调用该类中继承自SKSpriteNode的touchesBegind/任何方法,而不是在场景中调用它。你能给我举个小例子吗,我对Swift非常熟悉,我不理解你所说的继承自SKSpriteNode的意思。非常感谢你!您以前使用过面向对象编程语言吗?我建议在尝试制作游戏之前先学习一些更快速的/计算机科学。继承是非常基本的。敬畏的人,我很难过地看到堆栈溢出严重地未能回答这个问题。我怀疑Bobytza是否还会在意,但我还是要发布一个答案。感谢laaate的回答:也许有时候我会再次尝试我的想法。