2017-05-05 7 views
2

이것은 플레이어 용 클래스입니다.Swift 3 Physicsbody Collisions가 작동하지 않습니다.

내 플레이어가 서로 마주 치는 Gamefield와 충돌하지 않습니다. 나는 그들이 서로의 위에 있기를 원하지 않는다. 나는 해결책을 찾으려고 노력했지만 나에게 그것은 내가 대부분 괜찮은 것처럼 보인다.

제발 도와주세요 :

class Player: SKShapeNode { 
    static public let length: CGFloat = 50 
    static public let rect = CGRect(x: -length/2, y: -length/2, width: length, height: length) 

    var life = 100 

    override init() { 
     super.init() 
     self.fillColor = SKColor.blue 
     self.strokeColor = SKColor.black 
     self.position = CGPoint(x: 50, y: 50) 

     self.physicsBody = SKPhysicsBody(edgeLoopFrom: Player.rect) 
     self.physicsBody?.isDynamic = true 
     self.physicsBody?.allowsRotation = false 
     self.physicsBody?.categoryBitMask = PhysicsCategory.Robot 
     self.physicsBody?.contactTestBitMask = PhysicsCategory.Projectile 
     self.physicsBody?.collisionBitMask = PhysicsCategory.Gamefield 
     self.physicsBody?.usesPreciseCollisionDetection = true 
    }; required init?(coder aDecoder: NSCoder) {fatalError("init(coder:) has not been implemented")} 

    func moveBy(vect: CGVector) { 
     self.position.x += vect.dx 
     self.position.y += vect.dy 
     //print(vect.dx, vect.dy) 
    } 
} 

이 내 Gamescene 클래스

struct PhysicsCategory { 
    static let None   : UInt32 = UInt32.min 
    static let All   : UInt32 = UInt32.max 
    static let Robot  : UInt32 = 0b0001  // 1 
    static let Gamefield : UInt32 = 0b0010  // 2 
    static let Monster  : UInt32 = 0b0011  // 3 
    static let Projectile : UInt32 = 0b0100  // 4 
} 

class GameScene: SKScene, SKPhysicsContactDelegate { 
    var player = Player(rect: Player.rect) 
    var controlL: Control 
    var controlR: Control 

    var cam = SKCameraNode() 

    override init(size: CGSize) { 
     controlL = Control(posX: 0, size: size, direction: 1) 
     controlR = Control(posX: size.width, size: size, direction: -1) 

     super.init(size: size) 

    }; required init?(coder aDecoder: NSCoder) {fatalError("init(coder:) has not been implemented")} 

    override func didMove(to view: SKView) { 
     self.backgroundColor = SKColor.white 

     physicsWorld.gravity = CGVector.zero 
     physicsWorld.contactDelegate = self 

     cam.xScale = 1 
     cam.yScale = 1 
     self.camera = cam 
     player.addChild(cam) 

     let gameFieldRect = CGRect(x: 0, y: 0, width: 1000, height: 600) 
     let gameField = SKShapeNode(rect: gameFieldRect) 
      gameField.fillColor = SKColor.clear 
      gameField.strokeColor = SKColor.black 
      gameField.position = CGPoint(x: 0, y: 0) 

      gameField.physicsBody = SKPhysicsBody(edgeLoopFrom: gameFieldRect) 
      gameField.physicsBody?.isDynamic = true 
      gameField.physicsBody?.allowsRotation = false 
      gameField.physicsBody?.categoryBitMask = PhysicsCategory.Gamefield 
      gameField.physicsBody?.contactTestBitMask = PhysicsCategory.None 
      gameField.physicsBody?.collisionBitMask = PhysicsCategory.Robot 
     self.addChild(gameField) 

     self.addChild(player) 

     cam.addChild(controlL.add()) 
     cam.addChild(controlR.add()) 

입니다 누군가가 실수를 볼 수 있기를 바랍니다. 이미 꽤 오래되었습니다.

답변

1

당신은 다른 물리 체형 (rectangleOf)?

SpriteKit 물리 기관, 볼륨 기반 기관 및 에지 기반의 몸 두 종류의 지원에 로봇을 변경해야합니다. 피직스 바디를 만들 때 피처 바디의 종류, 크기 및 모양은 호출하는 생성자 메서드에 의해 결정됩니다. 모서리 기반 몸체는 질량 또는 체적을 가지지 않으며 시스템의 힘 또는 충격에 영향을받지 않습니다. 에지 기반 바디는 물리 시뮬레이션에서 볼륨이없는 경계 또는 빈 공간을 나타내는 데 사용됩니다. 대조적으로, 체적 기반의 몸체는 질량과 체적을 가진 물체를 나타내는 데 사용됩니다.

또한 충동이나 힘으로 로봇을 움직이고 있습니까? .move가 아니거나 .position =? 이동 위치는 물리학의 세계가

또한, 당신이

didBegin (연락처 :)에 대한 적절한 시리즈로 분류 마스크 (변경해야 할 것 같습니다 (이 일부 시나리오에서는 그것을 통해 이동합니다) 중단됩니다 1, 2, 4, 8, 16 등등이되어야합니다 ... 고유 한 접촉 히트 .. 지금은 0 + 4 또는 1 + 3에서 "4"의 히트 수를 얻을 수 있습니다. ... 따라서 고유 한 충돌이 아닙니다.

귀하의 collisionBitMask는 좋아 보이지만 .. 서로 부딪혀 야합니다.