3

因此,我对 swift 和 iOS 开发非常陌生,但对编程并不完全陌生,并且只是通过一些教程,但基本上我的代码如下所示:

import SpriteKit


class GameScene: SKScene {


override func didMoveToView(view: SKView) {
    let circle = SKShapeNode(circleOfRadius: 30.0)
    circle.position = CGPointMake(100, 200)
    addChild(circle)
}

override func touchesMoved(touches: NSSet, withEvent event: UIEvent) {
    for touch in touches {
        let location = touch.locationInNode(self)
        let touchedNode = nodeAtPoint(location)
        touchedNode.position = location;
    }
}

}

当我构建它时,它会在我拖动它时识别并移动圆圈,但只能移动大约 30 像素,然后我必须再次触摸它才能移动它。我在这里做错了什么?

4

2 回答 2

3

我可能错了,但我相信您的手指正在离开节点限制并进入后台。我会这样设置:

// First make the shape available throughout the code and make sure you have a place to save the touch event for later use.
var circle: SKShapeNode!
var circleTouch: UITouch?

// Create the Shape
override func didMoveToView(view: SKView) {
    circle = SKShapeNode(circleOfRadius: 30.0)
    circle.position = CGPointMake(100, 200)
    addChild(circle)
}

// When a finger is placed on the screen, check if it's in the circle, if it is, keep that touch even in memory so we can reference it later because other fingers could touch other things in the scene.
override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
    for touch in touches {
        if nodeAtPoint(touch.locationInNode(self)) == circle {
            circleTouch = touch as? UITouch
        }
    }
}

// Check if the touch event that is moving is the one that anchored the circle to our finger, if yes, move the circle to the position of the finger.
override func touchesMoved(touches: NSSet, withEvent event: UIEvent) {
    for touch in touches {
        if circleTouch != nil {
            if touch as UITouch == circleTouch! {
                let location = touch.locationInNode(self)
                circle.position = location
            }
        }
    }
}

// Clean up the touch event when the finger anchoring the circle is raised from the screen.
override func touchesEnded(touches: NSSet, withEvent event: UIEvent) {
    for touch in touches {
        if circleTouch != nil {
            if touch as UITouch == circleTouch! {
                circleTouch = nil
            }
        }
    }
}

您也可以在其中使用if let语句,但nil为了清楚起见,我进行了检查。

于 2015-01-27T18:43:57.370 回答
1

Tokuriku,非常感谢,我们不太正确,但它让我得到了最终的答案,这里是

import SpriteKit

class GameScene: SKScene {
var circleTouch: UITouch?

override func didMoveToView(view: SKView) {
    /* Setup your scene here */
    let circle = SKShapeNode(circleOfRadius: 40.0)
    circle.fillColor = UIColor.blackColor()
    circle.position = CGPoint(x: size.width * 0.5, y: size.height * 0.2)
    circle.name = "userCircle"
    addChild(circle)
}

override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
    for touch in touches {
        if nodeAtPoint(touch.locationInNode(self)).name == "userCircle" {
            circleTouch = touch as? UITouch
        }
    }
}

override func touchesMoved(touches: NSSet, withEvent event: UIEvent) {
    for touch in touches {
        if circleTouch != nil {
            if touch as UITouch == circleTouch! {
                let location = touch.locationInNode(self)
                let touchedNode = nodeAtPoint(location)
                touchedNode.position = location
            }
        }
    }
}

override func touchesEnded(touches: NSSet, withEvent event: UIEvent) {
    for touch in touches {
        if circleTouch != nil {
            if touch as UITouch == circleTouch! {
                circleTouch = nil
            }
        }
    }
}
于 2015-01-28T05:27:08.620 回答