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  

CoreMotion




import SpriteKit
import CoreMotion

enum CollisionTypes: UInt32 {
  case player = 1
  case wall = 2
  case star = 4
  case rig = 3
}

final class GameScene: SKScene, SKPhysicsContactDelegate {
 private var player: SKSpriteNode!
 private var lastTouchPosition: CGPoint?
 private var motionManager: CMMotionManager?
 private var scoreLabel: SKLabelNode!
 private var score = 0 {
  didSet {
      scoreLabel.text = "Score: \(score)"
    }
  }
private var isGameOver = false
private var items = [String]()
private var teleportDestination = [CGPoint]()

override func didMove(to view: SKView) {
   createScoreLabel()
   loadLevel()
   createPlayer()
   physicsWorld.gravity = .zero
   physicsWorld.contactDelegate = self
  motionManager = CMMotionManager()
  motionManager?.startAccelerometerUpdates()
  let rightRect = CGRect(x: self.frame.size.width, y: 0, width: 1, height: self.frame.size.height)
  let right = SKNode()
  right.physicsBody = SKPhysicsBody(edgeLoopFrom: rightRect)
  self.addChild(right)
  right.name = "right"
   // right.physicsBody?.categoryBitMask = rightCategory
  right.physicsBody?.categoryBitMask = CollisionTypes.rig.rawValue
   right.physicsBody?.contactTestBitMask = CollisionTypes.player.rawValue
    right.physicsBody?.collisionBitMask = CollisionTypes.wall.rawValue
}

 override func update(_ currentTime: TimeInterval) {
  guard isGameOver == false else { return }
   #if targetEnvironment(simulator)
   if let lastTouchPosition = lastTouchPosition {
  let diff = CGPoint(x: lastTouchPosition.x - player.position.x, y: lastTouchPosition.y - player.position.y)
  physicsWorld.gravity = CGVector(dx: diff.x / 100, dy: diff.y / 100)
 }
 #else
  if let accelrometerData = motionManager?.accelerometerData {
   physicsWorld.gravity = CGVector(dx: accelrometerData.acceleration.x * 10, dy: accelrometerData.acceleration.y * 10)
 }
 #endif
/*
 if let accelerometerData = motionManager.accelerometerData {
 physicsWorld.gravity = CGVector(dx: accelerometerData.acceleration.y * -50, dy: accelerometerData.acceleration.x * 50)
 }
if let lastTouchPosition = lastTouchPosition {
 let diff = CGPoint(x: lastTouchPosition.x - player.position.x, y: lastTouchPosition.y - player.position.y)
   physicsWorld.gravity = CGVector(dx: diff.x / 200, dy: diff.y / 200)
}
 */
}
private func loadLevel() {
  let itm:CGFloat = frame.size.width/12
  guard let levelURL = Bundle.main.url(forResource: "level1", withExtension: "txt") else {
   fatalError("Could't find")
 }
guard let levelString = try? String(contentsOf: levelURL) else {
   fatalError("Could't load")
 }
 let lines = levelString.components(separatedBy: "\n")
  for (row, line) in lines.reversed().enumerated() {
    for (column, letter) in line.enumerated() {
     let position = CGPoint(x: (Int(itm) * column) + 16, y: (Int(itm) * row) + Int(self.frame.height) / 8)
     if letter == "a" {
     createBlock(in: position)
   }else if letter == "s" {
      createStar(in: position)
    }else if letter == "y" {
    createfild(in: position)
 }
 }
 }
}
private func createBlock(in position: CGPoint) {
  let node = SKSpriteNode(imageNamed: "Field0")
 node.name = "block"
  items.append(node.name!)
  node.position = position
  node.physicsBody = SKPhysicsBody(rectangleOf: node.size)
  node.physicsBody?.categoryBitMask = CollisionTypes.wall.rawValue
  node.physicsBody?.isDynamic = false
 addChild(node)
 node.setScale(1.05)
}
private func createScoreLabel() {
 scoreLabel = SKLabelNode(fontNamed: "AvenirNext-Bold")
  scoreLabel.text = "Score: 0"
  scoreLabel.horizontalAlignmentMode = .left
  scoreLabel.position = CGPoint(x: 50, y: 50)
  scoreLabel.zPosition = 2
  addChild(scoreLabel)
}
private func createPlayer() {
player = SKSpriteNode(imageNamed: "player")
 player.position = CGPoint(x: frame.size.width/12 + player.size.width * 0.38, y: frame.height - 270 )
 player.zPosition = 1
 player.physicsBody = SKPhysicsBody(circleOfRadius: player.size.width / 2)
 player.physicsBody?.allowsRotation = false
 player.physicsBody?.linearDamping = 0.8
 player.physicsBody?.categoryBitMask = CollisionTypes.player.rawValue
 player.physicsBody?.contactTestBitMask = CollisionTypes.star.rawValue
 player.physicsBody?.collisionBitMask = CollisionTypes.wall.rawValue
addChild(player)
 player.setScale(0.55)
}
 private func createStar(in position: CGPoint) {
   let node = SKSpriteNode(imageNamed: "star")
  node.name = "star"
  items.append(node.name!)
  node.physicsBody = SKPhysicsBody(circleOfRadius: node.size.width / 2)
  node.physicsBody?.isDynamic = false
  node.physicsBody?.categoryBitMask = CollisionTypes.star.rawValue
  node.physicsBody?.contactTestBitMask = CollisionTypes.player.rawValue
  node.physicsBody?.collisionBitMask = 0
  node.position = position
  addChild(node)
  node.setScale(0.5)
 }
private func createfild(in position: CGPoint) {
  let node = SKSpriteNode(imageNamed: "Field2")
  node.name = "fild"
  items.append(node.name!)
  node.physicsBody = SKPhysicsBody(circleOfRadius: node.size.width / 2)
  node.physicsBody?.isDynamic = false
  node.physicsBody?.categoryBitMask = CollisionTypes.rig.rawValue
 node.physicsBody?.contactTestBitMask = CollisionTypes.player.rawValue
  node.physicsBody?.collisionBitMask = 0
  node.position = position
 addChild(node)
  node.setScale(1.01)
 }
private func playerCollided(with node: SKNode) {
  if node.name == "star" {
    node.removeFromParent()
    score += 1
}
  if node.name == "fild" {
    node.removeFromParent()
    score += 3
  }
 }
 private func ballCollided(with node: SKNode) {
  if node.name == "right" {
   node.removeFromParent()
   let gameOverScene = GameScene(size: self.frame.size)
   self.view?.presentScene(gameOverScene)
 }
}
func didBegin(_ contact: SKPhysicsContact) {
 guard let nodeA = contact.bodyA.node else { return }
 guard let nodeB = contact.bodyB.node else { return }
  if nodeA == player {
     playerCollided(with: nodeB)
 } else if nodeB == player {
    playerCollided(with: nodeA)
    ballCollided(with: nodeA)
 }
 }
override func touchesBegan(_ touches: Set, with event: UIEvent?) {
 guard let touch = touches.first else { return }
  let location = touch.location(in: self)
  lastTouchPosition = location
 }
override func touchesMoved(_ touches: Set, with event: UIEvent?) {
   guard let touch = touches.first else { return }
   let location = touch.location(in: self)
   lastTouchPosition = location
}
override func touchesEnded(_ touches: Set, with event: UIEvent?) {
  lastTouchPosition = nil
  }
}