physics3


import SpriteKit
import GameplayKit

extension SKPhysicsBody {
func ideal() -> SKPhysicsBody {
  //摩擦係数の値で 1 に近いほど摩擦が多くなります0.0から1.0の間
  self.friction = 0
  self.linearDamping = 0  //粘性//体にかかる流体または空気の摩擦力
  self.angularDamping = 0  //体の回転速度を遅くする特性 0.0から1.0の間の値
  self.restitution = 0.98  //反発率
  self.isDynamic = true  //動かせる性質
  self.allowsRotation = false //角力とインパルスの影響デフォルト値はtrue
  // 重力を無視する 重力の影響を受けない
  //circleA.physicsBody?.affectedByGravity = false
  self.affectedByGravity = true
  return self
}
}

class GameScene: SKScene, SKPhysicsContactDelegate {

override func didMove(to view: SKView) {
  backgroundColor = .blue
  self.physicsWorld.contactDelegate = self
  physicsBody = SKPhysicsBody(edgeLoopFrom: frame)
  physicsWorld.gravity = CGVector(dx: 0, dy: -2)

let circleA = SKShapeNode(circleOfRadius: 50)//circleOfRadiusで円の半径
  circleA.position = CGPoint(x:self.frame.midX, y:self.frame.midY + 230)
  circleA.fillColor = UIColor.red
  circleA.lineWidth = 4.0
  circleA.strokeColor = UIColor.lightGray
  self.addChild(circleA)
  circleA.physicsBody = SKPhysicsBody(circleOfRadius: circleA.frame.width/2).ideal()

  //物体Aのカテゴリ0と物体Bの衝突が等しくなければAはBを通過する。それ以外は衝突する
   //Aカテゴリ
  circleA.physicsBody?.categoryBitMask = 0x1 << 0
   //通過する(衝突される側のcategoryBitMaskとcollisionBitMaskを0にする)
   circleA.physicsBody?.collisionBitMask = 0x1 << 0
    
  let circleB = SKShapeNode(circleOfRadius: 25)//circleOfRadiusで円の半径
   circleB.position = CGPoint(x:self.frame.midX, y:self.frame.midY + 110)
   circleB.fillColor = UIColor.yellow
   circleB.lineWidth = 4.0
   circleB.strokeColor = UIColor.lightGray
   self.addChild(circleB)
   circleB.physicsBody = SKPhysicsBody(circleOfRadius: circleB.frame.width/2).ideal()   
 circleB.physicsBody?.categoryBitMask = 0x1 << 1
 circleB.physicsBody?.collisionBitMask = 0x1 << 1

// 四角形を作成
let squareB = SKShapeNode(rectOf: CGSize(width:100, height:100),cornerRadius: 5)
// 四角形の配置位置を指定
 squareB.position = CGPoint(x:self.frame.midX, y:self.frame.midY - 200)
// 四角形の色を指定
squareB.fillColor = .green
squareB.lineWidth = 0.0
// シーンに追加
  self.addChild(squareB)
  squareB.physicsBody = SKPhysicsBody(rectangleOf: squareB.frame.size).ideal()
//Bカテゴリ
  squareB.physicsBody?.categoryBitMask = 0x1 << 0 + 0x1 << 1
  //通過する(衝突される側のcategoryBitMaskとcollisionBitMaskを1にする)
  squareB.physicsBody?.collisionBitMask = 0x1 << 0 + 0x1 << 1
//後から指定したsquareBが上に表示される
}
   override func touchesBegan(_ touches: Set, with event: UIEvent?) {
}

}