es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Mostrar puntuación de SpriteKit en la vista de SwiftUI.

Estoy intentando crear un ZStack que superponga el Puntaje de mi escena de SpriteKit. Tengo el siguiente código en este momento, esto funciona mostrando el código en la escena, pero quiero mostrarlo en la vista.

Aquí está la función:

// MARK: – Agregar Puntaje
func addScore(){
if gameScore < 250 {
gameScore += 1
scoreLabel.text = String(format: "%06d", gameScore)
let possibleScores: Set = [10, 20, 30, 40, 50, 65, 80, 95, 110, 125, 150, 175, 200, 250]

    if possibleScores.contains(gameScore) {
        startNewLevel()
    }
} else {
    gameScore += 2
    scoreLabel.text = String(format: &quot;%06d&quot;, gameScore)
    let possibleScores: Set = [10, 20, 30, 40, 50, 65, 80, 95, 110, 125, 150, 175, 200, 250]

    if possibleScores.contains(gameScore) {
        startNewLevel()
    }
}

}

Mi código de vista se ve así:

import SwiftUI
import SpriteKit

struct PageTwo: View {

@State var gameScore = 0

var body: some View {
ZStack {
GameView()
ZStack {
Text("Puntaje: (gameScore)")
.foregroundColor(.white)
}
}
}
}

Está mostrando el Puntaje, pero no lo está contando, así que tal vez alguien pueda decirme dónde estoy equivocando aquí? Este SpriteKit + SwiftUI es nuevo para mí y aún no lo entiendo del todo.

Tags:  ,

Answer

  1. Avatar for davy.ai

    El problema con el código es que la Puntuación no se está actualizando en la Vista al mismo tiempo que se está actualizando en la Escena. Para actualizar la Puntuación en la Vista, es necesario utilizar una vinculación y pasarla a la Escena.

    Actualice el código de la Vista para pasar la vinculación del juegoScore a la GameView:

    struct PageTwo: View {
        @State var gameScore = 0
    
        var body: some View {
            ZStack {
                GameView(gameScore: $gameScore)
                ZStack {
                    Text("Score: \(gameScore)")
                        .foregroundColor(.white)
                }
            }
        }
    }
    

    Luego, actualice el código de la GameScene para utilizar la vinculación y actualizar la Puntuación:

    class GameScene: SKScene, SKPhysicsContactDelegate {
    
        @Binding var gameScore: Int // añadir esta línea
    
        let removeLabel = SKAction.sequence([SKAction.fadeIn(withDuration: 0.3), SKAction.wait(forDuration: 0.8), SKAction.fadeOut(withDuration: 0.3)])
    
        override func sceneDidLoad() {
            super.sceneDidLoad()
        }
    
        // MARK: - Añadir Puntuación
        func addScore(){
            if gameScore < 250 {
                gameScore += 1
                scoreLabel.text = String(format: "%06d", gameScore)
                let possibleScores: Set = [10, 20, 30, 40, 50, 65, 80, 95, 110, 125, 150, 175, 200, 250]
    
                if possibleScores.contains(gameScore) {
                    startNewLevel()
                }
            } else {
                gameScore += 2
                scoreLabel.text = String(format: "%06d", gameScore)
                let possibleScores: Set = [10, 20, 30, 40, 50, 65, 80, 95, 110, 125, 150, 175, 200, 250]
    
                if possibleScores.contains(gameScore) {
                    startNewLevel()
                }
            }
        }
    }
    

    Ahora la Puntuación se actualizará tanto en la Escena como en la Vista.

Comments are closed.