Слияние SKShapeNode и SKLabelNode

Я хотел бы объединить SKShapeNode и SKLabeNode, чтобы сделать только один узел

Вот мой класс «Блок», который нарисовал прямоугольник и добавил к нему дочерний элемент sklabelnode:

class Bloque : SKShapeNode
{
    var color : String!
    var numero : Int!
    var type : Int!

    var labelNumeroBloque : SKLabelNode!


    init(type : Int, numero : Int, tailleBloque : CGSize)
    {
        super.init()

        self.numero = numero
        self.type = type


        switch (type)
        {
            case 0: color = "#4aaddb"
            default: color = "#ccc"
        }


        var rect = CGRect(origin: CGPoint(x: 0.5, y: 0.5), size: CGSize(width: tailleBloque.width, height: tailleBloque.height))

        self.path = CGPathCreateWithRoundedRect(rect, 2.0, 2.0, nil)
        self.fillColor = UIColor(rgba: color)
        self.name = "\(numero)"
        self.lineWidth = 0.0
        self.zPosition = 200


        labelNumeroBloque = SKLabelNode(text: String(numero))
        labelNumeroBloque.position = CGPointMake(tailleBloque.width/2, tailleBloque.height/2)
        labelNumeroBloque.verticalAlignmentMode = .Center
        labelNumeroBloque.horizontalAlignmentMode = .Center
        labelNumeroBloque.fontName = "ArialMT"
        labelNumeroBloque.fontSize = 20
        labelNumeroBloque.name = "\(numero)"

        self.addChild(labelNumeroBloque)
    }


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

С этим кодом, когда я нажимаю на цветное пространство, он работает, но если пользователь нажимает на номер, он не работает. Похоже, что SKShapeNode и SKlabelNode не являются одним целым узлом.

Изображение блока

Вот функция touchesBegan:

override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent)
{
    for touch in (touches as! Set<UITouch>)
    {
        let location = touch.locationInNode(self)
        let cliqueNode = nodeAtPoint(location)

        if let bloque = cliqueNode as? Bloque
        {   // verifie que le bloque est du type Bloque
            nb++
            bloque.removeFromParent()
        }
        else
        {   // mauvais bloque cliqué    
            println("Debug : mauvais bloque")
        }   
    }
}

Я хотел бы знать, как я могу объединить оба SKNode, чтобы сделать только один, поэтому, когда пользователь нажимает на цветную зону или на номер, он работает. Кто-нибудь может мне помочь ? Извините за мой плохой английский :/


person Xakaa    schedule 19.07.2015    source источник


Ответы (2)


Возможно, вам потребуется создать подкласс SKLabelNode, переопределить func calculateAccumulatedFrame() -> CGRect и вернуть нулевой размер CGRect. Метка возвращается, потому что func nodeAtPoint(_ p: CGPoint) -> SKNode Возвращает самого глубокого потомка, который пересекает точку. И он использует calculateAccumulatedFrame() для проверки пересечений, поэтому, возвращая прямоугольник нулевого размера, он не будет пересекаться, таким образом возвращая ваш SKShapeNode.

Код может выглядеть так:

class SpecialLabelNode: SKLabelNode {
    override func calculateAccumulatedFrame() -> CGRect {
        return CGRectZero
    }
}

class Bloque : SKShapeNode {
    ...
    var labelNumeroBloque : SpecialLabelNode!
    ...
}
person KleMiX    schedule 30.07.2015

Поскольку вы сделали Bloque подклассом SKShapeNode, а SKShapeNode является подклассом SKNode, возможно, вы можете установить для свойства userInteractionEnabled экземпляра Bloque значение true. Затем вы можете написать функцию touchesBegan touchesEnd непосредственно внутри класса Bloque. Таким образом, вам не нужно вычислять, произошло ли касание внутри региона. Эти функции будут запускаться только внутри региона экземпляра Bloque.

person J.Doe    schedule 30.09.2015