Mostrar SpriteKit pontuação na SwiftUI Vista

0

Pergunta

Eu estou tentando fazer um ZStack que irá se sobrepor a Pontuação do meu SpriteKit cena. Eu tenho o seguinte código para a direita agora, isso funciona mostrando o código dentro do realmente cena, mas eu quero mostrar em 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()
}

Aqui é a função:

// 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()
        }
    }
}

A meu Ver o código tenha esta aparência:

import SwiftUI
import SpriteKit

struct PageTwo: View {

@State var gameScore = 0

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

Ele está mostrando a Pontuação, mas não contar a ele, talvez por isso alguém pode me dizer onde eu estou indo errado aqui? Este SpriteKit + SwiftUI é novo para mim, e ainda não é o bastante tenho-o.

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

Melhor resposta

0

Você precisa usar ObservableObject e um editor para que, eu olhei para os seus códigos, existe algum código fonte em falta, como sempre é um exemplo para você:

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

Infelizmente, isso não muda nada, mas eu acho que isso me fez mais de perto. O que é, no entanto, não fazendo, é a contagem da pontuação. Ele deve addScore() toda vez que um asteróide é destruído. Eu sei que o todo poderia ser útil, mas é um monte de código. Eu sou basicamente reconstrução da minha jogo, de modo que a INTERFACE do usuário é 100% SwiftUI e a lógica SpriteKit.
Norbert

Você já tentou meus dada códigos de resposta? ele trabalha para mim. E é uma maneira para que você, como eu disse, eu não acesso ao seu projeto completo e eu acho que isso faz nenhuma mudança na minha resposta. Não há outro caminho para você, tudo está na minha resposta. A forma é usando ObservableObject.
swiftPunk

Eu acho que a última peça do quebra-cabeça é que a .onTapGesture não está certo, porque eu não quero addScore() onTapGesture, mas sim, quando a bala atinge o asteróide. O resto do seu código funciona, porque eu testei com onAppear
Norbert

Quem disse que você deve usar .onTapGesture no seu projeto! Ele é um exemplo de teste que podemos ler/wright para a aula! por que você mistura o código de teste com o seu projeto. nenhuma idéia! O problema não é SwiftUI ou SpriteKit, você precisa aprender o básico primeiro! ps: sobre a chamar a função de addScore() você pode chamar sempre quando e onde quiser, o seu último comentário mostra que você tem problema básico na codificação.
swiftPunk

Eu sei que o seu exemplo é o código de teste, e que trabalhou. Eu só tenho que descobrir como fazê-lo contar agora com a lógica do jogo no swiftui.
Norbert

Em outros idiomas

Esta página está em outros idiomas

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