为什么不检测碰撞和接触?

时间:2015-10-29 22:50:18

标签: swift sprite-kit

我已经在这工作了大约一个星期了,我需要帮助。请弄清楚为什么这不起作用!

(P.S。我的GameScene中有SKPhysicsContactDelegate。另外,我的didMoveToView中有self.physicsWorld.contactDelegate = self。)

这是我的代码:

这不在didMoveToView:

之外
let squareGroup: UInt32 = 1
let obstacleGroup: UInt32 = 2

这是我的didMoveToView:

square.position = CGPointMake(self.size.width/2, self.size.height/1.5)
square.zPosition = 35
square.size = CGSize(width: 40, height: 40)
square.physicsBody = SKPhysicsBody(rectangleOfSize: square.size)
square.physicsBody?.affectedByGravity = false
square.physicsBody?.dynamic = true
square.physicsBody?.allowsRotation = false
square.physicsBody?.categoryBitMask = squareGroup
square.physicsBody?.collisionBitMask = obstacleGroup
square.physicsBody?.contactTestBitMask = obstacleGroup
square.name = "Square"
self.addChild(square)

这也在我的didMoveToView中:* AND:当方形和障碍物触摸时没有任何反应。它不打印联系或任何东西。

func didBeginContact(contact: SKPhysicsContact) {

    print("contact")

    let newScene = GameplayScene(size: self.size)
    _ = SKTransition.fadeWithDuration(1)
    self.view?.presentScene(newScene)

}

最后,这是我的障碍代码,它位于didMoveToView之外: 请注意:我现在只是尝试使用障碍物2来让它工作。

func addObstacles() {

    let obstacle1 = SKSpriteNode(imageNamed: "Obstacle")
    let obstacle2 = SKSpriteNode(imageNamed: "Obstacle")
    obstacle1.xScale = 2
    obstacle2.xScale = 2


    func randInRange(range: Range<Int>) -> Int {
        return  Int(arc4random_uniform(UInt32(range.endIndex - range.startIndex))) + range.startIndex
    }

    let random = randInRange(205...470)
    let moveDown1 = SKAction.moveByX(0, y: -self.size.width, duration: 2.5)
    let repeatAction1 = SKAction.repeatActionForever(moveDown1)
    let removeObstacle1 = SKAction.removeFromParent()
    let moveAndRemove1 = SKAction.sequence([repeatAction1, removeObstacle1])


    obstacle1.position = CGPointMake(CGFloat(random), self.frame.size.height * 2)
    obstacle1.zPosition = 40
    obstacle1.physicsBody = SKPhysicsBody(rectangleOfSize: obstacle1.size)
    obstacle1.physicsBody?.affectedByGravity = false
    obstacle1.physicsBody?.dynamic = false
    obstacle1.runAction(moveAndRemove1)
    self.addChild(obstacle1)

    let moveDown2 = SKAction.moveByX(0, y: -self.size.width, duration: 2.5)
    let repeatAction2 = SKAction.repeatActionForever(moveDown2)
    let removeObstacle2 = SKAction.removeFromParent()
    let moveAndRemove2 = SKAction.sequence([repeatAction2, removeObstacle2])


    obstacle2.position = CGPointMake(CGFloat(random) + 460, self.frame.size.height * 2)
    obstacle2.zPosition = 40
    obstacle2.physicsBody = SKPhysicsBody(rectangleOfSize: obstacle2.size)
    obstacle2.physicsBody?.affectedByGravity = false
    obstacle2.physicsBody?.dynamic = false
    obstacle2.physicsBody?.categoryBitMask = obstacleGroup


    obstacle2.name = "Obstacle2"


    obstacle2.runAction(moveAndRemove2)
    self.addChild(obstacle2)

}


func repeatObstacles() {
    let generateObstacles = SKAction.sequence([SKAction.runBlock(self.addObstacles), SKAction.waitForDuration(1.3)])
    let endlessAction = SKAction.repeatActionForever(generateObstacles)
    runAction(endlessAction)

}

我已经坚持了一段时间了。如果您需要更多信息,请问我!我需要帮助。

2 个答案:

答案 0 :(得分:2)

categoryBitMask应该像这样定义:

let squareGroup: UInt32 = 0x1 << 1
let obstacleGroup: UInt32 = 0x1 << 2

还定义障碍collisionBitMask

obstacle2.physicsBody?.collisionBitMask = obstacleGroup

你的障碍contactTestBitMask

obstacle2.physicsBody?.contactTestBitMask = squareGroup

检查联系方式:

func didBeginContact(contact: SKPhysicsContact) {
    if ((contact.bodyA.categoryBitMask == squareGroup && contact.bodyB.categoryBitMask == obstacleGroup) ||
        (contact.bodyA.categoryBitMask == obstacleGroup && contact.bodyB.categoryBitMask == squareGroup)) {

        // Handle Contact
    }
}

答案 1 :(得分:1)

首先:将您的联系人代码更改为

func didBeginContact(contact: SKPhysicsContact) {

    print("contact")

    if ((contact.bodyA.categoryBitMask == squareGroup &&   contact.bodyB.categoryBitMask == obstacleGroup) ||
    (contact.bodyA.categoryBitMask == obstacleGroup && contact.bodyB.categoryBitMask == squareGroup)) {

      NSNotificationCenter.defaultCenter().postNotificationName("Gameover",object:nil,userInfo:nil);
    }
}     

在当前场景中分配一个新场景是不好的做法,这是你应该告诉视图要做的事情。在这里开始与我聊天,我将在你的视图中讨论如何设置它,因为这不是当前答案的一部分。有更好的方法来处理这个问题,发布通知是让您开始传达视图的最简单方法,让我们开始工作,然后您可以研究如何创建代理。

其次,将接触和碰撞组添加到障碍物2对象:      obstacle2.physicsBody?.collisionBitMask = obstacleGroup obstacle2.physicsBody?.contactTestBitMask = squareGroup  正如@Darvydas指出的那样

第三,将障碍物2动态切换为true,因为您希望它与其他项目进行交互: obstacle2.physicsBody?.dynamic = false

现在你应该进入didBeginContact方法,在print("contact")上放一个断点,看看你是否进入那里。

第四,从didMoveToView中取出didBeginContact函数,否则永远不会被调用。 (如果我们在问题中正确看到了这段代码,它就会被解决了)