Show SpriteKit skóre v SwiftUI Zobrazit

0

Otázka

Snažím se, aby ZStack, že bude overlay Skóre z mého SpriteKit scény. Mám následující kód, teď to funguje ukazuje kód ve skutečnosti scénu, ale chci ukázat, že v Pohledu

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

Zde je funkce:

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

Můj Názor, kód vypadá takto:

import SwiftUI
import SpriteKit

struct PageTwo: View {

@State var gameScore = 0

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

Je zobrazeno Skóre, ale nepočítám to, takže možná, že někdo mi může říct, kde jsem jít špatně? Tento SpriteKit + SwiftUI je pro mě nová a ještě ne tak docela dostal.

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

Nejlepší odpověď

0

Musíte použít ObservableObject a vydavatele za to, že jsem se podíval na vaše kódy, tam je nějaký kód, zdroj chybí, jak kdy to je příklad pro vás:

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

Bohužel to nebylo nic měnit, ale myslím, že mě to dostalo blíž. Co je však nedělá je počítání skóre. To by addScore ()-pokaždé, asteroid je zničen. Vím, že to celé mohlo by být užitečné, ale je to hodně kódu. Já jsem v podstatě přestavět svou hru tak, že UI je 100% SwiftUI a logika SpriteKit.
Norbert

Zkoušel jsi moje uvedeny kódy v odpověď? funguje to pro mě. A to je způsob, jak pro vás, jak jsem řekl, nemám přístup k vaší plné projekt a myslím, že to dělá bez změny ve své odpovědi, a to buď. Neexistuje žádný jiný způsob, jak pro vás, vše je na mou odpověď. Cesta je pomocí ObservableObject.
swiftPunk

Myslím, že poslední kousek skládačky je, že .onTapGesture není v pořádku, protože já nechci addScore() onTapGesture, ale spíše, když kulka zasáhne asteroid. Zbytek váš kód funguje, protože jsem to testoval s onAppear
Norbert

Kdo řekl, že byste měli použít .onTapGesture v projektu! To je příklad pro test, který můžeme číst/wright do třídy! proč jste míchání testovací kód s vaším projektem. žádný nápad! Váš problém není SwiftUI nebo SpriteKit, musíte se naučit základní na prvním místě! ps: o volání funkce addScore() můžete volat, když někdy a kde vůbec chcete, váš poslední komentář ukazuje, že máte základní problém v kódování.
swiftPunk

Vím, že tvůj příklad je testovací kód, a fungovalo to. Jen musím vymyslet, jak udělat to počítat teď s herní logiku v swiftui.
Norbert

V jiných jazycích

Tato stránka je v jiných jazycích

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