7

저는 충돌을 등록하기 위해 두 SKSpriteNodes를 얻으려는 지난 이틀간 어려움을 겪었으며 didBegin#contact을 나타냅니다.iOS Swift didBeginContact가 호출되지 않았습니다.

두 개체에 대해 비트 마스크 'categoryBitMask', 'contactTestBitMask'및 'collisionTestBitMask'을 설정했습니다. 나는 또한

initPhysics() 'true'에 모두에 대해 'dynamic'속성을 설정 한

는 괜찮 physicsWorld를 설정하는 것 같다. 둘 다 physicsBodies의 categoryBitMask을 (init을해야 당신이 자동차와 slowCar 사이의 접촉을 원하는 경우

내가 기대하고있어 모든

didBegin#Contact가 호출되어 있지만 그렇지 않은

//Set up Physicsbody bit masks 
let playerCarBitMask: UInt32 = 0x1 << 1 
let slowCarBitMask: UInt32 = 0x1 << 2 



//initPhysics 
func initPhysics() { 
    println("((((((((((((((Initiating Physicsbody))))))))))))))") 
    self.physicsWorld.contactDelegate = self 
    self.physicsWorld.gravity = CGVector.zeroVector 

    println("self.physicsWorld.contactDelegate = \(self.physicsWorld.contactDelegate)") 

} 

//setupPlayer 
func setupPlayer() { 

    car = SKSpriteNode(imageNamed: "redCarUp") 
    car.setScale(2.0) 
    car.position = CGPoint(x: 800, y: 400) 
    car.zPosition = 100 
    car.name = "car" 

    gameNode.addChild(car) 

    let carBody = SKPhysicsBody(
     rectangleOfSize: car.frame.size, center: car.position) 

    carBody.dynamic = true 
    carBody.categoryBitMask = playerCarBitMask 
    carBody.contactTestBitMask = slowCarBitMask 
    carBody.mass = 5 
    carBody.collisionBitMask = slowCarBitMask 
    car.physicsBody = carBody 

    println("carBody = \(carBody)") 
    println("carBody.dynamic = \(carBody.dynamic)") 
    println("carBody.mass = \(carBody.mass)") 
    println("carBody.categoryBitMask = \(carBody.categoryBitMask)") 
    println("carBody.contactTestBitMask = \(carBody.contactTestBitMask)") 
    println("carBody.collisionBitMask = \(carBody.contactTestBitMask)") 



    slowCar = SKSpriteNode(imageNamed: "blueCarUp") 
    slowCar.setScale(2.0) 
    let slowCarScenePos = CGPoint(
     x: 680, 
     y: 2048) 


    slowCar.position = gameNode.convertPoint(slowCarScenePos, fromNode: self) 
    println("slowCar.position = \(slowCar.position) ****") 
    slowCar.zPosition = 80 
    slowCar.name = "slowCar" 



    let slowCarBody = SKPhysicsBody(
     rectangleOfSize: slowCar.frame.size, center: slowCar.position) 


    println("slowCar = \(slowCar) ****") 

    slowCarBody.dynamic = true 
    slowCarBody.categoryBitMask = slowCarBitMask 
    slowCarBody.contactTestBitMask = playerCarBitMask 
    slowCarBody.mass = 5 
    slowCarBody.collisionBitMask = playerCarBitMask 
    slowCar.physicsBody = slowCarBody 
    gameNode.addChild(slowCar) 



} 

func didBeginContact(contact: SKPhysicsContact!) { 
    println("*******************PhysicsContact********************") 
} 
+1

코드 덤프는이 플랫폼에서 인정되지 않습니다. – Mundi

+0

**와 collisionBitMask는 ** contactTestBitMask **로 설정해야합니다. 이건 보통 잡았다. 스토리 보드 편집기에서 ** 기본적으로 contactTestBitMask를 0으로 남겨 둡니다 ** - 이것은 일반적인 문제입니다. 그냥 "1"로 설정하십시오 – Fattie

답변

2

간단한 문제로 밝혀졌습니다. 내 원래 코드 그래서 같이 SKPhysicsBody 검출 프레임에 대한 매개 변수를 설정 하였다

let carBody = SKPhysicsBody( rectangleOfSize: car.frame.size, center: car.position)

유사하게 I는 I가 물리적 충돌을 테스트 하였다 번째 노드에 대해 동일하게 수행 하였다. 간단히 제거

'중심'과 같이 매개 변수 : 두 개의 스프라이트 노드

let carBody = SKPhysicsBody(rectangleOfSize: car.frame.size)

문제를 해결하고, 노드가 이제 서로 충돌 예상대로 옆으로 자신을 밀어 넣습니다.

3

나는 당신이 한 생각). 두 물리학 체 사이의 접촉을 얻으려면 아래 코드를보십시오. 연락처가 있으면 디스플레이 기능을 반환합니다 :

//init your categoryBitMask : 
let carCategory:UInt32 = 0x1 << 0 
let SlowCarCategory:UInt32 = 0x1 << 1 


//init car 
car.physicsBody?.categoryBitMask = carCategory 
car.physicsBody?.contactTestBitMask = slowCarCategory 

//init slowCar 
slowCar.physicsBody?.categoryBitMask = slowCarCategory 
slowCar.physicsBody?.contactTestBitMask = CarCategory 

// set your contact function 
func didBeginContact(contact: SKPhysicsContact!) 
{ 
    var firstBody: SKPhysicsBody 
    var secondBody: SKPhysicsBody 


    if (contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask) 
    { 
     firstBody = contact.bodyA 
     secondBody = contact.bodyB 

    } 
    else 
    { 
     firstBody = contact.bodyB 
     secondBody = contact.bodyA 
    } 


    if ((firstBody.categoryBitMask & carCategory) != 0 && (secondBody.categoryBitMask & slowCarCategory) != 0) 
    { 
     displayfunction(firstBody.node as SKSpriteNode, car: secondBody.node as SKSpriteNode) 
    } 
} 

func displayFunction (slowCar : SKSpriteNode, car : SKSpriteNode) 
+0

그것이 당신을 위해 일하고 있습니까? – Haox

+0

감사합니다. 불행히도 didBeginContact()가 처음에는 호출되지 않았습니다. 나는 단지 전체 코드를 제거하여 화면에 스프라이트를 놓고 물리 엔진을 설정 한 다음 다른 하나를 치도록 조치를 실행하지만 불행히도 여전히 작동하지 않습니다. – Headstock67

+0

categoryBitMask를'car'와'slowCar'로 설정합니까? 당신의 코드에서'carBody'와'slowCarBody'를 설정하십시오. – Haox

0

해당 연락처를 참고하시기 바랍니다가

(node.physicsBody?.isDynamic = false) 
8

'didBeginContact은'빠른 3

func didBegin(_ contact: SKPhysicsContact) { //stuff }

에 'didBegin'로 변경되었습니다 두 개의 정적 기관 사이에 감지되지 않습니다 난에서 코드를했다 신속한 2와 'didBeginContact'는 거기에 앉아 있었지만 부름을받지 않았다. 꽤 하얀 후에 나는 그 기능이 변경되었다는 것을 알아 냈다. 그래서 저는 제 대답이 누군가를 도울 수 있다고 생각했습니다.

관련 문제