2022.09.25 Programming  spritekit  swiftui  
 2022.09.19 Programming  swiftui  
 2022.09.11 Programming  swiftui  
 2022.09.04 Programming  swiftui  
 2022.08.28 Programming  spritekit  
 2022.08.28 Programming  spritekit  
 2022.08.28 Programming  spritekit  
 2022.07.31 Programming  spritekit  
 2022.07.10 Programming  spritekit  
 2022.07.03 Programming  spritekit  
 2022.06.26 Programming  spritekit  
 2022.06.19 Programming  spritekit  
 2022.06.14 Programming  spritekit  swiftui  
 2022.06.04 Programming  spritekit  
 2022.05.22 Programming  spritekit  
 2022.05.04 Programming  spritekit  
 2022.04.29 Programming  spritekit  
 2022.04.24 Programming  spritekit  

ObservableObj


import SwiftUI
import SpriteKit


class GameScene: SKScene, SKPhysicsContactDelegate, ObservableObject {  // <<: Here 1
  //  @Published var updates = 0
    @Published var gameScore = 0 // <<: Here 2
    @Published var lenght: CGFloat = 1
          var up: Bool = false

  //  let removeLabel = SKAction.sequence([SKAction.fadeIn(withDuration: 0.3), SKAction.wait(forDuration: 0.8), SKAction.fadeOut(withDuration: 0.3)])
    let tball = SKShapeNode(circleOfRadius: 20)
    
    var lastUpdateTime2 : TimeInterval = 0  
    override func didMove(to view: SKView) {
        backgroundColor = .yellow
        physicsBody = SKPhysicsBody(edgeLoopFrom: frame)        
        tball.position = CGPoint(x: 0, y: 0)
             tball.fillColor = .blue
             self.addChild(tball)
     //   tball.zPosition = 10
    }    
    func change(){
       if self.lenght > 100 {
              up = false
         }else if (self.lenght < 10){
               up = true
       }
            up ? (self.lenght += 1) : (self.lenght -= 1)
       }
override func update(_ currentTime: TimeInterval) {
      //   self.change()
  if lastUpdateTime2 == 0 {
        lastUpdateTime2 = currentTime
     }
    if currentTime - lastUpdateTime2 > 1 - 0.9 {
       self.change()
       lastUpdateTime2 = currentTime
        }
           }
    /*
    func ball() {
   let ball = SKShapeNode(circleOfRadius: 20)
    let MinValue = self.size.width / 8
   let MaxValue = self.size.width  - 50
    let SpawnPoint = UInt32(MaxValue - MinValue)
   ball.position = CGPoint(x: CGFloat(arc4random_uniform(SpawnPoint)), y: 200)
      ball.fillColor = .blue
      self.addChild(ball)
    }
     */
 func ball() {
      let moveDown = SKAction.moveTo(x:130, duration: 2.5)
      let moveUp = SKAction.moveTo(x: -130, duration: 2.5)
      let actionSequence2 = SKAction.sequence([moveDown, moveUp])
      let moveRepeat = SKAction.repeatForever(actionSequence2)
    tball.run(moveRepeat, withKey: "moveX")
    }
 func ball2() {
    let moveDown2 = SKAction.moveTo(x:130, duration: -2.5)
    let moveUp2 = SKAction.moveTo(x: -130, duration: -2.5)
    let actionSequence3 = SKAction.sequence([moveDown2, moveUp2])
    let moveRepeat2 = SKAction.repeatForever(actionSequence3)
    tball.run(moveRepeat2, withKey: "moveX2")
    }
    func addScore(){
        if gameScore < 10 {
            gameScore += 1            
        } else {
            gameScore += 5            
        }
    }    
}
struct ContentView: View {
    @State var flag = true
    @State var showingSheet : Bool = false
 //   @StateObject var gameScene = GameScene() // <<: Here 3
 /*
    let scene: GameScene = {
     let scene = GameScene()
     scene.size = CGSize(width: 300, height: 300)
     scene.scaleMode = .fill
     return scene
 }()
*/
@StateObject private var scene: GameScene = {
    let scene = GameScene()
     scene.size = CGSize(width: 300, height: 300)
     scene.anchorPoint = CGPoint(x: 0.5, y: 0.5)
      scene.scaleMode = .fill
       return scene
  }()           
    var body: some View {
        Spacer()
        VStack {
        Button(action: {
            if(self.flag){
             scene.ball()
             self.flag = false
          }
           else{
              scene.ball2()
             self.flag = true
           }
           }
        ){
          Text("ball start on off")
             .font(.title3)
              .foregroundColor(Color.purple)
               .padding(.bottom, 20)
  }
       Button(
           action: { showingSheet = true },
            label: {
           Text("ShowSheet")
          })
        .sheet(isPresented: $showingSheet){
         SecondSheet()
          }
 }
     ZStack {
         SpriteView(scene: scene)
             .frame(width: 300, height: 300)
             .ignoresSafeArea()
        Circle().frame(width: scene.lenght, height: scene.lenght)
            .foregroundColor(.green)
              .padding(.top, 150)
   
        Button(action: {
          scene.addScore()
            }) {
             Text("Score: \(scene.gameScore)")
              .font(.title3)
               .frame(width: 110, height: 30, alignment: .center)
                .foregroundColor(Color.white)
                .background(Color.pink)
                 .cornerRadius(5, antialiased: true)
                 .padding(.bottom, 130)
      }
     }
     .padding(.bottom, 110)       
    }    
}
struct SecondSheet: View {
    @Environment(\.dismiss) var dismiss
     var body: some View {
         VStack{
   Text("SecondSheet")
       .fontWeight(.heavy)
       .font(.title)
   Button("画面を閉じる") {
     dismiss()
     }
     }
 }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}