Show SpriteKit scorul în SwiftUI Vedere

0

Problema

Eu sunt încercarea de a face o ZStack că va suprapune Scorul din SpriteKit scena. Am codul de mai jos chiar acum, acest lucru funcționează arată codul în fapt scena, dar eu vreau să-l arăt în Vedere

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

Aici este funcția:

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

Punctul meu de Vedere, codul arata astfel:

import SwiftUI
import SpriteKit

struct PageTwo: View {

@State var gameScore = 0

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

Se arată Scorul, dar nu de numărare, deci poate cineva poate spune-mi unde am greșit aici? Acest SpriteKit + SwiftUI este nou pentru mine și încă nu a luat-o destul.

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

Cel mai bun răspuns

0

Aveți nevoie pentru a utiliza ObservableObject si o persoana pentru care, m-am uitat la codurile dvs., există un cod sursa care lipsesc, cum este un exemplu pentru tine:

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

Din pacate asta nu schimba nimic, dar cred că am ajuns mai aproape. Ceea ce este însă nu de a face este de numărare în sus scorul. Acesta ar trebui să addScore() de fiecare dată când un asteroid este distrus. Știu că toată ar putea fi de ajutor, dar este o mulțime de cod. Eu sunt de fapt mi refac joc, astfel încât UI este de 100% SwiftUI și logica SpriteKit.
Norbert

Ai încercat și mi-a dat codurile de răspuns? acesta funcționează pentru mine. Și aceasta este o modalitate pentru tine, cum am spus nu am acces la full proiect și cred că se face nici o schimbare în răspunsul meu, fie. Nu există nici o altă cale pentru tine, totul este în răspunsul meu. Drumul este folosind ObservableObject.
swiftPunk

Cred că ultima piesă a puzzle-ului este faptul că .onTapGesture nu este în regulă, că nu vreau să addScore() onTapGesture, ci mai degrabă atunci când glonțul lovește asteroid. Restul codului funcționează, pentru că am testat-o cu onAppear
Norbert

Cine a spus că ar trebui să utilizați .onTapGesture în proiectul dumneavoastră! Acesta este un exemplu de test care se poate citi/wright la clasa! de ce te amesteci codul de testare cu proiectul dumneavoastră. nici o idee! Problema ta nu este SwiftUI sau SpriteKit, aveți nevoie pentru a învăța de bază de la început! ps: despre apelarea funcției de addScore() puteți apela atunci când vreodată și în cazul în care vreodată doriți, ultimul tau comentariu arată problemă de bază în codificare.
swiftPunk

Știu că exemplul tău e cod de încercare, și care a lucrat. Trebuie doar să dau seama cum de a face conta acum cu joc de logica în swiftui.
Norbert

În alte limbi

Această pagină este în alte limbi

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