SwiftUİ Görünümünde SpriteKit puanını göster

0

Soru

SpriteKit sahnemdeki Skoru üst üste bindirecek bir ZStack yapmaya çalışıyorum. Şu anda aşağıdaki kodu aldım, bu aslında sahnedeki kodu gösteriyor, ancak Görünümde göstermek istiyorum

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

İşte işlev:

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

Görünüm kodum şuna benziyor:

import SwiftUI
import SpriteKit

struct PageTwo: View {

@State var gameScore = 0

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

Skoru gösteriyor, ama saymıyor, belki birisi bana burada nerede yanlış gittiğimi söyleyebilir mi? Bu SpriteKit + SwiftUİ benim için yeni ve hala tam olarak anlamadım.

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

En iyi cevabı

0

Bunun için ObservableObject ve bir yayıncı kullanmanız gerekiyor, kodlarınıza baktım, bazı kod kaynakları eksik, sizin için nasıl bir örnek:

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

Ne yazık ki bu hiçbir şeyi değiştirmedi, ama sanırım beni daha da yaklaştırdı. Ancak yapmadığı şey skoru saymaktır. Bir asteroit her yok edildiğinde score () değerini eklemelidir. Her şeyin yararlı olabileceğini biliyorum, ama bu çok fazla kod. Temel olarak oyunumu yeniden inşa ediyorum, böylece kullanıcı arayüzü %100 SwiftUİ ve mantık SpriteKit.
Norbert

Verdiğim kodları cevap olarak denedin mi? bu benim için çalışıyor. Ve bu sizin için bir yol, dediğim gibi, tam projenize erişemiyorum ve cevabımda da bir değişiklik yapmadığını düşünüyorum. Senin için başka yol yok, hepsi benim cevabımda. Yol ObservableObject kullanıyor.
swiftPunk

Sanırım bulmacanın son parçası bu .onTapGesture doğru değil, çünkü addScore() onTapGesture istemiyorum, mermi asteroite çarptığında. Kodunuzun geri kalanı çalışıyor, çünkü onAppear ile test ettim
Norbert

Kullanman gerektiğini kim söyledi? .onTapGesture projende! Bu, sınıfa/wright okuyabileceğimizi test etmek için bir örnektir! neden test kodunu projenizle karıştırıyorsunuz. hiçbir fikrim yok. Sorununuz SwiftUİ veya SpriteKit değil, ilk başta temel öğrenmeniz gerekiyor! not: işlevini çağırma hakkında addScore() istediğiniz zaman ve istediğiniz yerde arama yapabilirsiniz, son yorumunuz kodlamada temel sorunlarınız olduğunu gösterir.
swiftPunk

Örneğinizin test kodu olduğunu biliyorum ve bu işe yaradı. Sadece swiftui'deki oyun mantığıyla nasıl sayılacağını bulmalıyım.
Norbert

Diğer dillerde

Bu sayfa diğer dillerde

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