Montrer SpriteKit score en SwiftUI Vue

0

La question

Je suis en train de faire un ZStack qui se superpose au Score à partir de mon SpriteKit scène. J'ai eu le code suivant à droite maintenant, cela fonctionne indiquant le code dans la réalité de la scène, mais je veux l'afficher dans la Vue

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

Voici la fonction:

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

Mon point de Vue, le code ressemble à ceci:

import SwiftUI
import SpriteKit

struct PageTwo: View {

@State var gameScore = 0

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

Il affiche le Score, mais pas le compter, peut-être que quelqu'un peut me dire où je vais mal ici? Cette SpriteKit + SwiftUI est nouveau pour moi, et encore pas tout eu.

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

La meilleure réponse

0

Vous avez besoin d'utiliser ObservableObject et un éditeur pour qui, j'ai regardé vos codes, il y a un peu de code source manquant, comment jamais, il est un exemple pour vous:

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

Malheureusement, ça ne change pas grand chose, mais je pense qu'il m'en rapprocher. Ce n'est cependant pas faire est de compter le score. Il devrait addScore() à chaque fois qu'un astéroïde est détruit. Je sais que le tout serait utile, mais c'est beaucoup de code. Je suis fondamentalement la reconstruction de mon jeu, de sorte que l'INTERFACE utilisateur est 100% SwiftUI et la logique SpriteKit.
Norbert

Avez-vous essayé d'utiliser mon codes de réponse? il fonctionne pour moi. Et c'est une façon pour vous, comme je l'ai dit je n'ai pas accès à la totalité de votre projet et je pense qu'il n'apporte aucun changement dans ma réponse. Il n'y a pas d'autre moyen pour vous, tout est dans ma réponse. La façon est d'utiliser ObservableObject.
swiftPunk

Je pense que la dernière pièce du puzzle, c'est que l' .onTapGesture n'est pas droit, parce que je ne veux pas addScore() onTapGesture, mais plutôt quand la balle frappe l'astéroïde. Le reste de votre code fonctionne, cause je l'ai testé avec onAppear
Norbert

Qui a dit que vous devez utiliser .onTapGesture dans votre projet! C'est un exemple de test que l'on peut lire/wright à la classe! pourquoi tu mélange le code de test avec votre projet. aucune idée! Votre problème n'est pas SwiftUI ou SpriteKit, vous avez besoin d'apprendre les rudiments de au premier! ps: à propos de l'appel de la fonction de addScore() vous pouvez appeler quand et où vous voulez, votre dernier commentaire montre que vous avez un problème de base dans le codage.
swiftPunk

Je sais que votre exemple de code de test, et ça a fonctionné. Je dois juste trouver comment faire compter désormais avec la logique du jeu en swiftui.
Norbert

Dans d'autres langues

Cette page est dans d'autres langues

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