2017-05-05 10 views
2

これはプレーヤーのクラスですSwift 3 Physicsbody Collisionsが動作しません

My Playerは、お互いの間を行き来するGamefieldと衝突しません。 私は彼らがお互いの上にいることを望んでいません。 私はGoogleに解決策を試みましたが、私にとってはほとんど大丈夫でした。

助けてください:

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ベースは、物理学のボディ、ボリュームベースボディとエッジベースボディの2種類をサポートしています。フィジックスボディを作成すると、その種類、サイズ、およびシェイプは、呼び出すコンストラクタメソッドによって決まります。エッジベースのボディには質量や体積はなく、システム内の力やインパルスの影響を受けません。エッジベースのボディは、物理シミュレーションで音量の低い境界や空洞を表現するために使用されます。対照的に、ボリュームベースのボディは、質量と体積を持つオブジェクトを表すために使用されます。

また、インパルスや力を使ってロボットを動かしていますか? .move(ないし:)または.position =?移動や位置は、あなたの物理学の世界は

また、それはあなたが

didBegin(接触:))のために適切なシリーズへのあなたのカテゴリのマスクを(変更する必要があるように見える(それはいくつかのシナリオでは、それを通過します)壊れます1、2、4、8、16、など...これはあなたが得る方法ですユニークコンタクトヒット。今は0 + 4または1 + 3から「4」のヒットを得ることができます...したがって、ユニークな衝突ではありません。

あなたのcollisionBitMaskはうまく見えます。お互いに衝突しているはずです。

関連する問題