我正在对SKSpritenode(In Swift)进行子类化,以创建可以在场景中拖动的彩色块。子类是SoundNode。
import SpriteKit
class SoundNode: SKSpriteNode {
init() {
super.init(texture: nil, color: UIColor.blue, size: CGSize(width: 100, height: 100))
self.isUserInteractionEnabled = true
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
print("touch began")
}
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
print("touches moved")
guard let touch = touches.first else {
return
}
let touchLocation = touch.location(in: self)
self.position = touchLocation
}
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
print("touch ended")
}
}
在GameScene.swift中
import SpriteKit
class GameScene: SKScene {
override func didMove(to view: SKView) {
addSoundBlock()
}
func addSoundBlock() {
let soundBlock = SoundNode()
soundBlock.position = CGPoint(x: 800, y: 800)
addChild(soundBlock)
}
}
这很有用。
添加了soundBlock,可以在场景中拖动。但它会闪烁,有时会消失。 我在touchesMoved中尝试了其他方法,它们都没有影响到急动。
如果我没有将touchesBegan,touchesMoved,touchesEnded子类化,并在GameScene中实现动作,那么拖动变得平滑。但未来的计划取决于能否将这些子类化。
Xcode 8,Swift 3,iOS10
答案 0 :(得分:0)
我创建了一个类方法来处理SKSpriteNode子类(在我的情况下为“ Player”)的运动,并在GameScene.swift中将触摸的位置传递给了它。
Player.swift中的类方法声明:
func movePlayer(location: CGPoint) {
//movement code
}
调用GameScene.swift中的函数:
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
guard let location = touches.first?.location(in: self) else { return }
player.movePlayer(location: location)
}
我想有些清洁。并允许进一步的子类化。
答案 1 :(得分:-1)
当zPosition未设置为确保精灵位于其他节点之前时,我有时会发现精灵的外观不一致(即有时可见,有时不可见)。我想这可能是因为如果两个节点具有相同的zPosition,那么图形引擎就没有办法确保哪个节点在顶部。 尝试将zPosition设置为某个数字,以确保它位于其他节点之前。 例如:
soundBlock.position = CGPoint(x: 800, y: 800)
添加:
soundBlock.zPosition = 1000
我还没有尝试过这个,但可能值得一试?