2

我想合并一个 SKShapeNode 和一个 SKLabeNode 以仅创建一个节点

这是我的“Bloque”类,他绘制了一个矩形并在其上添加了一个 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 合并为一个,因此当用户单击彩色区域或输入数字时,它会起作用。有人能帮我吗 ?对不起,我的英语不好 :/

4

2 回答 2

1

由于您使 Bloque 成为 SKShapeNode 的子类,而 SKShapeNode 是 SKNode 的子类,因此您可以将Bloque 实例的userInteractionEnabled属性设置为 true。然后你可以直接在类 Bloque中编写touchesBegan touchesEnd函数。这样您就不必计算触摸是否在区域内。这些函数只会在 Bloque 实例的区域内触发。

于 2015-09-30T15:22:11.370 回答
0

您可能需要子类化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!
    ...
}
于 2015-07-30T14:20:04.480 回答