2

SKShapeNode と SKLabeNode をマージして 1 つのノードだけを作成したい

これは、長方形を描画し、その上に sklabelnode 子を追加した私の "Bloque" クラスです。

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 は 1 つのノード全体ではないようです

ブロック画像

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をマージして1つにする方法を知りたいので、ユーザーが色付きのゾーンまたは番号をクリックすると機能します。誰かが私を助けることができますか?私の悪い英語でごめんなさい:/

4

2 に答える 2

1

Bloque を SKShapeNode のサブクラスにし、SKShapeNode は SKNode のサブクラスにしたので、Bloque インスタンスのuserInteractionEnabledプロパティを true に設定できるかもしれません。次に、touchesBegan touchesEnd関数をクラス Bloque 内に直接記述できます。この方法では、タッチが領域内にあるかどうかを計算する必要はありません。これらの関数は、Bloque インスタンスの領域内でのみトリガーされます。

于 2015-09-30T15:22:11.370 に答える
0

サイズがゼロのをサブクラス化SKLabelNodeし、オーバーライドして返す必要がある場合があります。ポイントと交差する最も深い子孫を返すため、ラベルが返されます。また、交差をチェックするために使用されるため、サイズがゼロの四角形を返すと、交差せず、 が返されます。func calculateAccumulatedFrame() -> CGRectCGRectfunc 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 に答える