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  

Enumerated


import UIKit
import SpriteKit
import Foundation


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 scoreLabel: SKLabelNode!
  private var score = 0 {
    didSet {
      scoreLabel.text = "Score: \(score)"
    }

  private var items = [String]()
  private var teleportDestination = [CGPoint]()
  override func didMove(to view: SKView) {
    createScoreLabel()
    loadLevel()
    createPlayer()
    physicsWorld.gravity = .zero
    physicsWorld.contactDelegate = self
    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 = CollisionTypes.rig.rawValue
   right.physicsBody?.contactTestBitMask = CollisionTypes.player.rawValue
    right.physicsBody?.collisionBitMask = CollisionTypes.wall.rawValue
 }
override func update(_ currentTime: TimeInterval) {
  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: 16, y: 16)
  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 - 70 )
  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.star.rawValue
  node.physicsBody?.contactTestBitMask = CollisionTypes.player.rawValue
  node.physicsBody?.collisionBitMask = 0
  node.position = position
  addChild(node)
  node.setScale(1.05)
}
 private func playerCollided(with node: SKNode) {
  if node.name == "star" {
  node.removeFromParent()
  score += 1
 }
}
  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
 }
}
///////
level1.txt
a aaaaaaaaay
a        a
aaaaaaaa aaa
as         a
a  aa aayaaa
aaaaa     sa
a     aaaaaa
aaaaa aaaaaa
aaaaa aaaaaa
asaaa     sa
a aaa aaaaaa
a     yaaaaa
aaaaa
aaaaasaaaaaa
yaaaaaaaaaaa
//////