2017-05-05 3 views
2

Das ist meine Klasse für den SpielerSwift 3 Physicsbody Collisions funktioniert nicht

Mein Spieler kollidieren nicht mit dem Spielfeld sie durcheinander gehen Sie einfach. Ich möchte nicht, dass sie übereinander liegen. Ich habe versucht, die Lösung zu googeln, aber für mich scheint es, dass ich meistens in Ordnung war.

Bitte Hilfe:

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) 
    } 
} 

Das ist meine Gamescene Klasse ist

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()) 

Ich hoffe, dass jemand den Fehler sieht. Es hat mich schon ziemlich lange gedauert.

Antwort

1

Sie benötigen Roboter in eine andere Physik Körper-Typ (rectangleOf) ?:

SpriteKit unterstützt zwei Arten von Physik Körper zu verändern, volumenbasierte Körper und kantenbasierte Körper. Wenn Sie einen Physikkörper erstellen, werden seine Art, Größe und Form von der aufgerufenen Konstruktormethode bestimmt. Ein kantenbasierter Körper hat keine Masse oder Volumen und wird von Kräften oder Impulsen im System nicht beeinflusst. Kantenbasierte Körper werden verwendet, um volumenfreie Grenzen oder Hohlräume in Ihrer Physiksimulation darzustellen. Im Gegensatz dazu werden Volumenkörper verwendet, um Objekte mit Masse und Volumen darzustellen.

Verwenden Sie auch Impulse oder Kräfte, um Ihren Roboter zu bewegen? Nicht .move (zu :) oder .position =? bewegen und die Position wird brechen Ihre Physik Welt (es durch sie in einigen Szenarien gehen)

Auch sieht es so aus, wie Sie Ihre Kategorie Masken auf eine richtige Serie ändern müssen (für didBegin (Kontakt :))

es sollte sein, 1, 2, 4, 8, 16, so weiter ... das ist, wie Sie einzigartige Kontakttreffer bekommen .. Im Moment könnten Sie einen Treffer von "4" von 0 + 4 oder 1 + 3 bekommen ... also keine eindeutigen Kollisionen.

Ihre collisionBitMask sieht gut aus .. Sie sollten sich gegenseitig anstoßen.

Verwandte Themen