user20439709
user20439709

Reputation:

Neither adding a SKShapeNode nor adding a SKLabelNode to a SKScene appears to work?

Neither adding a SKShapeNode nor adding a SKLabelNode to a SKScene appears to work?

My gut guesses that I have a coordinate problem .. so here's the short code snippet which I have placed in my GameViewController class:

Note: I've added print statements below to debug.

FYI: I believe the values are wrong because they appear to be Frame coordinates, not Scene Coordinates. Frankly, I'm at a loss how to correct this error.

func addScoreLabelToScene(toScene: SKScene) {
    
    if thisSceneName == "GameScene" {
        
        let circleRadius = Double(100),
            circleOffset = Double(30),
            labelOffset  = Double(10),
            //
            circlePosX = toScene.frame.size.width/2  - circleRadius - circleOffset,
            labelPosX  = circlePosX - labelOffset,
            circlePosY = toScene.frame.size.height/2 + circleRadius + circleOffset,
            labelPosY  = circlePosY + labelOffset
        
        // frame.size = 818, 1340
        print("circlePosX = \(circlePosX)")   // 279
        print("circlePosY = \(circlePosY)")   // 800
        print("labelPosX  = \(labelPosX)")    // 269
        print("labelPosY  = \(labelPosY)")    // 810

        let circle = SKShapeNode(circleOfRadius: circleRadius)
        circle.position = CGPoint(x: circlePosX, y: circlePosY)
        circle.strokeColor = SKColor.red
        circle.lineWidth = 2.0
        circle.fillColor = SKColor.white
        toScene.addChild(circle)

        itsScoreLabel = SKLabelNode(fontNamed: "HelveticaNeue-Bold")
        itsScoreLabel!.position = CGPoint(x: labelPosX, y: labelPosY)
        itsScoreLabel!.text = "\(thisScore)"
        itsScoreLabel!.fontSize = 20
        itsScoreLabel!.fontColor = SKColor.blue
        toScene.addChild(itsScoreLabel!)
        
    }

}   // addScoreLabelToScene

WRT to the above guess about a coordinate problem, I have hard-wired values for the PosX and PosY variables, but no success there.

In addition I have commented out both toScene.addChild() calls (one at a time) with no luck.

To complete the problem description, I have code elsewhere that adds several SKSpriteNodes with no problem.

So, what mammoth error am I committing?

Upvotes: 0

Views: 47

Answers (1)

user20439709
user20439709

Reputation:

As already commented above, I owe kelin above immeasurable thanks for motivating me to check my code again!

The central issue centers on specifying .zPosition = 10 or any very large number so the 2 Objects are not buried under everything.

So ... the NEW code which does it right:

    func addScoreLabelToScene(toScene: SKScene) {
        
        if thisSceneName == "GameScene" {
            
            let circleRadius  = Double(50),   // lots of messing with #s involved
                circleOffsetX = Double(25)
#if os(iOS)
            let circleOffsetY = Double(105)
#elseif os(tvOS)
            let circleOffsetY = Double(25)
#endif
                // NR because we've centered the label within the circle.
                // Nevertheless, as noted below, we still have to position it
                // for horizontal + vertical alignment to take effect.
            let labelOffsetX  = Double(0),
                labelOffsetY  = Double(0),
                //
                circlePosX = toScene.frame.size.width/2  - circleRadius - circleOffsetX,
                labelPosX  = circlePosX - labelOffsetX,
                circlePosY = toScene.frame.size.height/2 - circleRadius - circleOffsetY,
                labelPosY  = circlePosY - labelOffsetY
            
            // added these print statements to debug:
            
            // frame.size = 818, 1340
            print("circlePosX = \(circlePosX)")   // 334 = 818/2  - 50 - 25
            print("circlePosY = \(circlePosY)")   // 515 = 1340/2 - 50 - 105
            print("labelPosX  = \(labelPosX)")    // 334 = 334 - 0
            print("labelPosY  = \(labelPosY)")    // 515 = 515 - 0

            let circle = SKShapeNode(circleOfRadius: circleRadius)
            circle.zPosition = 10   // otherwise, the Object will be buried at the bottom
            circle.position = CGPoint(x: circlePosX, y: circlePosY)
            circle.strokeColor = SKColor.red
            circle.lineWidth = 6.0
            circle.fillColor = SKColor.white
            toScene.addChild(circle)

            itsScoreLabel = SKLabelNode(fontNamed: "HelveticaNeue-Bold")
            itsScoreLabel!.zPosition = 10
            // still gotta position it for alignment to take affect
            itsScoreLabel!.position = CGPoint(x: labelPosX, y: labelPosY)
            itsScoreLabel!.horizontalAlignmentMode = .center
            itsScoreLabel!.verticalAlignmentMode   = .center
            itsScoreLabel!.text = "\(thisScore)"
            itsScoreLabel!.fontSize = 30
            itsScoreLabel!.fontColor = SKColor.blue
            toScene.addChild(itsScoreLabel!)
            
        }
    
    }   // addScoreLabelToScene

Upvotes: 0

Related Questions