SpriteKit touchesMoved在SKSpritenode的子类中使用时不稳定

时间:2016-11-24 20:20:06

标签: ios swift sprite-kit skspritenode

我正在对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

2 个答案:

答案 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

我还没有尝试过这个,但可能值得一试?