【问题标题】:Show SpriteKit score in SwiftUI View在 SwiftUI 视图中显示 SpriteKit 分数
【发布时间】:2022-01-02 03:35:47
【问题描述】:

我正在尝试制作一个 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 对我来说是新的,但还不是很了解。

【问题讨论】:

    标签: swiftui sprite-kit


    【解决方案1】:

    您需要为此使用 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
                }
            
        }
        
    }
    

    【讨论】:

    • 不幸的是,这并没有改变任何东西,但我认为它让我更接近了。然而,它没有做的是计算分数。每次小行星被摧毁时,它都应该 addScore()。我知道整体可能会有所帮助,但它有很多代码。我基本上是在重建我的游戏,以便 UI 是 100% SwiftUI 和逻辑 SpriteKit。
    • 您是否尝试过我给定的代码作为答案?这个对我有用。这对您来说是一种方式,正如我所说,我无法访问您的完整项目,我认为这也不会改变我的答案。你没有别的办法,一切尽在我的回答中。方式是使用 ObservableObject。
    • 我认为最后一块拼图是 .onTapGesture 不正确,因为我不想 addScore() onTapGesture,而是当子弹击中小行星时。你的代码的其余部分工作,因为我用 onAppear 测试它
    • 谁说你应该在你的项目中使用.onTapGesture!这是一个测试我们可以在课堂上阅读/写作的例子!为什么要将测试代码与项目混合。不知道!您的问题不是 SwiftUI 或 SpriteKit,您需要先学习基础知识! ps:关于调用addScore()的函数你可以随时随地调用,你最后的评论表明你在编码方面有基本的问题。
    • 我知道您的示例测试了代码,并且有效。我现在只需要弄清楚如何使用 swiftui 中的游戏逻辑来计算它。
    猜你喜欢
    • 2019-10-30
    • 1970-01-01
    • 2020-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-14
    相关资源
    最近更新 更多