(斯威夫特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;节点似乎对我的主项目没什么帮助。
所以...任何想法?
答案 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)
}
}
}
<强>输出强>: