Mostrar SpriteKit puntuación en SwiftUI Ver

0

Pregunta

Estoy tratando de hacer un ZStack que se superpondrá a la Puntuación de mi SpriteKit escena. Tengo el siguiente código justo ahora, este tipo de obras que muestran el código dentro de la realidad de la escena, pero lo que quiero mostrar en la Vista

import SwiftUI
import SpriteKit

var gameScore = 0

class GameScene: SKScene, SKPhysicsContactDelegate {

let removeLabel = SKAction.sequence([SKAction.fadeIn(withDuration: 0.3), SKAction.wait(forDuration: 0.8), SKAction.fadeOut(withDuration: 0.3)])

override func sceneDidLoad() {
    super.sceneDidLoad()
}

Esta es la función:

// MARK: - Add Score
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()
        }
    }
}

Mi código de la Vista se parece a esto:

import SwiftUI
import SpriteKit

struct PageTwo: View {

@State var gameScore = 0

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

Se trata de mostrar la Puntuación, pero no se cuenta, así que tal vez alguien me puede decir donde estoy pasando mal aquí? Este SpriteKit + SwiftUI es nuevo para mí y todavía no tengo.

sprite-kit swiftui
2021-11-23 16:22:40
1

Mejor respuesta

0

Usted necesita usar objeto observableobject y un editor para que, me miró a los códigos, no hay código fuente que falta, cómo siempre es un ejemplo para usted:

class GameScene: SKScene, SKPhysicsContactDelegate, ObservableObject {  // <<: Here 1
    
    @Published var gameScore = 0 // <<: Here 2
    
    let removeLabel = SKAction.sequence([SKAction.fadeIn(withDuration: 0.3), SKAction.wait(forDuration: 0.8), SKAction.fadeOut(withDuration: 0.3)])
    
    override func sceneDidLoad() {
        super.sceneDidLoad()
    }
    
    func addScore(){
        if gameScore < 250 {
            gameScore += 1
            
        } else {
            gameScore += 2
            
        }
    }
    
}



struct PageTwo: View {
    
    @StateObject var gameScene: GameScene = GameScene() // <<: Here 3
    
    var body: some View {
        
        Text("Score: \(gameScene.gameScore)") // <<: Here 4
            .onTapGesture {
                gameScene.addScore()  // <<: Here 5
            }
        
    }
    
}
2021-11-23 17:10:39

Por desgracia, eso no cambia nada, pero creo que me tiene más cerca. Lo que sin embargo, no está haciendo es el recuento de la puntuación. Debe addScore() cada vez que un asteroide se destruye. Sé que todo podría ser útil, pero es un montón de código. Estoy básicamente, la reconstrucción de mi juego para que la interfaz de usuario es 100% SwiftUI y la lógica de SpriteKit.
Norbert

¿Has probado mi dado los códigos de respuesta? a mí me funciona. Y es una manera para que usted, como ya he dicho no tengo acceso a su proyecto completo y creo que no hace ningún cambio en mi respuesta. No hay otra manera para usted, todo está en mi respuesta. El camino es el uso del objeto observableobject.
swiftPunk

Creo que la última pieza del rompecabezas es que el .onTapGesture no es correcto, porque yo no quiero addScore() onTapGesture, sino cuando la bala golpea el asteroide. El resto de tu código funciona, porque yo lo probé con onAppear
Norbert

Quién dijo que usted debe usar .onTapGesture en su proyecto! Es un ejemplo para probar que podemos leer/wright a clase! por qué mezclar el código de prueba con su proyecto. ni idea! El problema no es SwiftUI o SpriteKit, usted necesita aprender los conceptos básicos en primera! ps: sobre la llamada a la función de addScore() usted puede llamar cuando y donde quieras, tu último comentario muestra que usted tiene problema básico de la codificación.
swiftPunk

Sé que el ejemplo es el código de la prueba, y que trabajó. Yo sólo tengo que averiguar cómo hacer que se cuenta ahora con la lógica del juego en swiftui.
Norbert

En otros idiomas

Esta página está en otros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Slovenský
..................................................................................................................