节点不动

时间:2017-01-15 05:24:19

标签: swift xcode sprite-kit skspritenode

(斯威夫特3)

import SpriteKit
   import GameplayKit

   class GameScene: SKScene {
var object = SKSpriteNode()

override func didMove(to view: SKView) {

    object = self.childNode(withName: "dot") as! SKSpriteNode

}

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {

    for touch in touches {
        let location = touch.location(in: self)
        object.run(SKAction.move(to: location, duration: 0.3))

    }

}
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
    for touch in touches {
        let location = touch.location(in: self)

        object.run(SKAction.move(to: location, duration: 0.3))


    }
}

override func update(_ currentTime: TimeInterval) {




   }
}

此代码旨在让我拖动一个&#34; dot&#34;然而,在现场周围......我只是不能!它不会让步!我已经在网上看了,但我找不到任何东西。我尝试将这段代码粘贴到一个新项目中,它在那里工作,但即使删除和替换我的&#34; dot&#34;节点似乎对我的主项目没什么帮助。

所以...任何想法?

2 个答案:

答案 0 :(得分:3)

它在一个新的准系统项目中工作,而不是在你的更全面的项目中表明问题在于更完整的项目。没有一瞥,很难说出实际上出了什么问题。

对我而言,特殊的是使用SKAction在touchesMoved()中进行移动。如果您根据SKActions的工作方式考虑这一点,那么无论触摸屏的位置如何变化,您都会不断添加新的移动操作。这(几乎总是)比0.3秒快得多。更像是0.016秒。所以这应该会导致各种各样的问题。

此外,你需要在GameScene的touchesMoved()中确定被触摸的内容,然后,基于触摸点,移动它,具体而言。我认为,这是你的对象&#34;。

更简单的方法可能是在SKSpriteNode的子类中使用touchesMoved来表示并创建点实例。

答案 1 :(得分:3)

this 已经说过一切,你必须知道你的问题。 我尝试添加有助于您使用代码的详细信息。首先,在使用self.childNode(withName搜索节点时应使用可选绑定,因此如果此节点不存在,则项目不会崩溃。 然后,正如Confused所解释的那样,您应该在调用操作之前添加控件,以确保您的操作尚未运行。 我在下面举例说明:

import SpriteKit
class GameScene: SKScene {
    var object = SKSpriteNode.init(color: .red, size: CGSize(width:100,height:100))
    override func didMove(to view: SKView) {
        if let sprite = self.childNode(withName: "//dot") as? SKSpriteNode {
            object = sprite
        } else { //dot not exist so I draw a red square..
            addChild(object)
        }
        object.position = CGPoint(x:self.frame.midX,y:self.frame.midY)
    }
    func makeMoves(_ destination: CGPoint) {
        if object.action(forKey: "objectMove") == nil {
            object.run(SKAction.move(to: destination, duration: 0.3),withKey:"objectMove")
        }
    }
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        for touch in touches {
            let location = touch.location(in: self)
            makeMoves(location)
        }
    }
    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
        for touch in touches {
            let location = touch.location(in: self)
            makeMoves(location)
        }
    }
}

<强>输出

Confused