Pokaż wynik SpriteKit w widoku SwiftUI

0

Pytanie

Staram się stworzyć ZStack, który nakłada wynik z mojej sceny SpriteKit. Teraz mam następujący kod, działa, pokazując kod na prawdziwej scenie, ale chcę pokazać go w widoku

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

Oto funkcja:

// 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 kod prezentacji w następujący sposób:

import SwiftUI
import SpriteKit

struct PageTwo: View {

@State var gameScore = 0

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

To pokazuje wynik, ale nie uważa, że jego, tak, że może być, czy ktoś może mi powiedzieć, gdzie ja tu mylę? Ten SpriteKit + SwiftUI dla mnie nowość, a ja nadal nie do końca go zrozumiałem.

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

Najlepsza odpowiedź

0

Do tego trzeba użyć ObservableObject i wydawcy, przejrzałem twoje kody, brakuje jakiegoś źródło kodu, jak by to było, to jest przykład dla ciebie:

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

Niestety, to nic się nie zmieniło, ale myślę, że to zbliżyłem się. Jednak czego nie robi, to liczenie punktów. On musi dodać wartość() za każdym razem, gdy jest niszczony asteroida. Wiem, że to wszystko mogło by być przydatna, ale to dużo kodu. Ja przeważnie ustawiam swoją grę tak, aby interfejs użytkownika był na 100% szybko, a logika-спрайтекитом.
Norbert

Próbowałeś moje dane kody w odpowiedzi? to działa na mnie. I to jest sposób dla ciebie, jak już powiedziałem, nie mam dostępu do pełnego projektu, i myślę, że to również nie zmienia mojej odpowiedzi. Dla ciebie nie ma innego sposobu, wszystko w mojej odpowiedzi. Metoda polega na użyciu ObservableObject.
swiftPunk

Myślę, że ostatnia część układanki jest fakt, że .onTapGesture nie nadaje się, bo nie chcę dodawać onTapGesture (), a raczej, kiedy kula trafia w asteroidę. Pozostała część kodu działa, bo testowałem go za pomocą onAppear
Norbert

Kto powiedział, że musisz użyć .onTapGesture w swoim projekcie! To jest przykład w celu sprawdzenia, że możemy czytać/pisać w klasie! dlaczego mieszasz testowy kod ze swoim projektem. nie mam pojęcia! Problem nie jest w SwiftUI lub SpriteKit, najpierw trzeba nauczyć się podstaw! ps: o wywołaniu funkcji addScore() możesz dzwonić kiedy chcesz i gdziekolwiek jesteś, twój ostatni komentarz pokazuje, że masz podstawowe problemy z kodowaniem.
swiftPunk

Wiem, że w twoim przykładzie jest to testowy kod, i to się udało. Muszę dowiedzieć się, jak zrobić tak, aby to było teraz z pomocą logiki gry w swiftui.
Norbert

W innych językach

Ta strona jest w innych językach

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