onTouchesBegan () не вызывается для моего пользовательского SKNode - PullRequest
0 голосов
/ 29 апреля 2018

Я пытаюсь создать свой собственный DPad для своей игры, но по какой-то причине мой onTouchesBegan () не вызывается. Я немного исследовал и думаю, что причина этого в том, что мой self.frame.size по какой-то причине равен (0,0) даже после того, как я добавил свои дочерние узлы (вверх, вниз, влево, вправо). Я предполагаю, что так как размер равен 0, то нет ничего, что могло бы обнаружить прикосновение. Есть ли что-то, что я делаю, что здесь явно не так? Единственное, о чем я могу думать, может быть, потому что кнопки - это SKLabelNodes? Но я напечатал их размеры, и они все> 0.

protocol DPadDelegate {
    func upTapped()
    func downTapped()
    func leftTapped()
    func rightTapped()
}

open class DPad: SKNode {

    private var buttonsSize: CGFloat

    private var up:    SKLabelNode!
    private var down:  SKLabelNode!
    private var left:  SKLabelNode!
    private var right: SKLabelNode!

    private var timer = Timer()

    private var upHeld = false
    private var downHeld = false
    private var leftHeld = false
    private var rightHeld = false

    var delegate: DPadDelegate?

    public lazy var width: CGFloat = {
        return buttonsSize * 3
    }()

    public lazy var height: CGFloat = {
        return buttonsSize * 3
    }()

    init(buttonsSize: CGFloat) {
        self.buttonsSize = buttonsSize

        super.init()

        let center = SKLabelNode(text: "⏹")
        up = SKLabelNode(text: "?")
        down = SKLabelNode(text: "?")
        left = SKLabelNode(text: "◀️")
        right = SKLabelNode(text: "▶️")

        center.fontSize = buttonsSize
        up.fontSize = buttonsSize
        down.fontSize = buttonsSize
        left.fontSize = buttonsSize
        right.fontSize = buttonsSize

        center.position = CGPoint(x: 0, y: 0)
        up.position = CGPoint(x: 0, y: buttonsSize)
        down.position = CGPoint(x: 0, y: -buttonsSize)
        left.position = CGPoint(x: -buttonsSize, y: 0)
        right.position = CGPoint(x: buttonsSize, y: 0)

        self.addChild(center)
        self.addChild(up)
        self.addChild(down)
        self.addChild(left)
        self.addChild(right)

        print(self.frame.size)
    }

    required public init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

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

        if let touch = touches.first, up == atPoint(touch.location(in: self)) {
            upTapped()
            timer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(upTapped), userInfo: nil, repeats: true)
        }
        if let touch = touches.first, down == atPoint(touch.location(in: self)) {
            downTapped()
            timer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(downTapped), userInfo: nil, repeats: true)
        }
        if let touch = touches.first, left == atPoint(touch.location(in: self)) {
            leftTapped()
            timer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(leftTapped), userInfo: nil, repeats: true)
        }
        if let touch = touches.first, right == atPoint(touch.location(in: self)) {
            rightTapped()
            timer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(rightTapped), userInfo: nil, repeats: true)
        }
    }

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

        if let touch = touches.first {
            let location = touch.location(in: self)

            if upHeld && up != atPoint(location) {
                timer.invalidate()
                up.alpha = 1.0
                upHeld = false
            }
            if downHeld && down != atPoint(location) {
                timer.invalidate()
                down.alpha = 1.0
                downHeld = false
            }
            if rightHeld && right != atPoint(location) {
                timer.invalidate()
                right.alpha = 1.0
                rightHeld = false
            }
            if leftHeld && left != atPoint(location) {
                timer.invalidate()
                left.alpha = 1.0
                leftHeld = false
            }
        }
    }

    open override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
        resetDPad()
    }

    open override func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent?) {
        resetDPad()
    }

    private func resetDPad() {
        timer.invalidate()
        up.alpha = 1.0
        down.alpha = 1.0
        left.alpha = 1.0
        right.alpha = 1.0
        upHeld = false
        downHeld = false
        rightHeld = false
        leftHeld = false
    }

    @objc private func upTapped() {
        upHeld = true
        up.alpha = 0.6
        delegate?.upTapped()
    }

    @objc private func downTapped() {
        downHeld = true
        down.alpha = 0.6
        delegate?.downTapped()
    }

    @objc private func rightTapped() {
        rightHeld = true
        right.alpha = 0.6
        delegate?.rightTapped()
    }

    @objc private func leftTapped() {
        leftHeld = true
        left.alpha = 0.6
        delegate?.leftTapped()
    }

}

1 Ответ

0 голосов
/ 29 апреля 2018

добавьте isUserInteractionEnabled = true к вашей функции инициализации. В противном случае функции касания игнорируются

...