Показать результат SpriteKit в представлении SwiftUI

0

Вопрос

Я пытаюсь создать ZStack, который наложит партитуру с моей сцены SpriteKit. Прямо сейчас у меня есть следующий код, он работает, показывая код в реальной сцене, но я хочу показать его в представлении

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

Вот функция:

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

Мой код представления выглядит следующим образом:

import SwiftUI
import SpriteKit

struct PageTwo: View {

@State var gameScore = 0

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

Он показывает счет, но не считает его, так что, может быть, кто-нибудь может сказать мне, где я здесь ошибаюсь? Этот SpriteKit + SwiftUI для меня в новинку, и я все еще не совсем понял его.

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

Лучший ответ

0

Для этого вам нужно использовать ObservableObject и издателя, я просмотрел ваши коды, отсутствует какой-то источник кода, как бы то ни было, это пример для вас:

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

К сожалению, это ничего не изменило, но я думаю, что это приблизило меня. Однако чего он не делает, так это подсчета очков. Он должен добавлять значение() каждый раз, когда уничтожается астероид. Я знаю, что все это могло бы быть полезно, но это много кода. Я в основном перестраиваю свою игру так, чтобы пользовательский интерфейс был на 100% быстрым, а логика-спрайтекитом.
Norbert

Вы пробовали мои данные коды в ответе? это работает на меня. И это способ для вас, как я уже сказал, у меня нет доступа к вашему полному проекту, и я думаю, что это также не меняет моего ответа. Для тебя нет другого пути, все в моем ответе. Способ заключается в использовании ObservableObject.
swiftPunk

Я думаю, что последняя часть головоломки заключается в том, что .onTapGesture не подходит, потому что я не хочу добавлять onTapGesture (), а скорее, когда пуля попадает в астероид. Остальная часть вашего кода работает, потому что я протестировал его с помощью onAppear
Norbert

Кто сказал, что вы должны использовать .onTapGesture в вашем проекте! Это пример для проверки того, что мы можем читать/писать в классе! почему вы смешиваете тестовый код со своим проектом. понятия не имею! Ваша проблема не в SwiftUI или SpriteKit, сначала вам нужно изучить основы! ps: о вызове функции addScore() вы можете звонить когда угодно и куда угодно, ваш последний комментарий показывает, что у вас есть основные проблемы с кодированием.
swiftPunk

Я знаю, что в вашем примере это тестовый код, и это сработало. Мне просто нужно выяснить, как сделать так, чтобы это считалось сейчас с помощью игровой логики в swiftui.
Norbert

На других языках

Эта страница на других языках

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