在swift中调用函数时遇到问题

在swift中调用函数时遇到问题,swift,sprite-kit,xcode7,Swift,Sprite Kit,Xcode7,当我调用我的didbegincontact函数时,此函数应该通过增加宽度来增加蛇的大小。但是,当建立联系时,它会调用该函数一次,然后再也不会调用它。我不知道为什么当接触到蛇的时候,它不会不断地增加我的蛇的大小 func increaseSnakeSize(increment: CGFloat){ snake.snake1.size = CGSizeMake(snake.size.width + increment, snake.size.height + increment)

当我调用我的
didbegincontact
函数时,此函数应该通过增加宽度来增加蛇的大小。但是,当建立联系时,它会调用该函数一次,然后再也不会调用它。我不知道为什么当接触到蛇的时候,它不会不断地增加我的蛇的大小

func increaseSnakeSize(increment: CGFloat){

    snake.snake1.size = CGSizeMake(snake.size.width + increment, snake.size.height + increment)
    snake.snake2.size = CGSizeMake(snake.size.width + increment, snake.size.height + increment)
    snake.snake3.size = CGSizeMake(snake.size.width + increment, snake.size.height + increment)
    print(snake.snake1.size)
}
//
didBeginContact

if (firstBody.categoryBitMask & physicsCategory.snakeCategory == 0b1) && (secondBody.categoryBitMask & physicsCategory.foodCategory == 0b10 ){

    score++
    scoreLabel.text = "\(score)"
    food.removeFromParent()
    addFood()
    increaseSnakeSize(2)
}

看起来你没有增加你的蛇的
PhysicsBody
。你的应用程序中是否显示了物理热门框?如果没有,我建议打开它们,看看它的行为。在您的视图代码中,执行:
self.showsPhysics=true

当进行初始接触时,蛇会生长到22x22,但其物理体的大小保持在20x20。一个解决方案是创建一个新的物理体,初始接触为22x22,下一接触为24x24,之后接触为26x26。。。比如说,

func increaseSnakeSize (increment: CGFloat) {
    snake.snake1.size = CGSizeMake(snake.size.width + increment, snake.size.height + increment)
    // Create a new, larger physics body that matches the size of the snake
    snake.snake1.physicsBody = SKPhysicsBody(circleOfRadius:snake.size.width/2.0)
    // Configure the physics body's property accordingly
    snake.snake1.physicsBody?.affectedByGravity = false
    ...
}
另一个潜在问题是
触点的顺序。bodyA
触点。bodyB
可以在触点之间切换。你需要检查蛇是否是第一个身体,食物是否是第二个身体,食物是否是第一个身体,蛇是否是第二个身体。这里有一个例子

func didBeginContact (contact: SKPhysicsContact) {

    var firstBody, 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 == physicsCategory.snakeCategory) && (secondBody.categoryBitMask == physicsCategory.foodCategory ) {
        // Increase size of the snake

    }

你能更清楚地解释你的问题吗
increaseSnakeSize
只需调用一个,大小是否增加?下次它不会打电话了?除非你把第一个和第二个身体分类(按类别分类),否则你需要检查
firstBody
是否是食物,
secondBody
是否是蛇。改变精灵的大小不会改变它的物理身体的大小。每次蛇生长时,你都需要创建一个新的、更大的物理体。蛇1、蛇2、蛇3在开始时都是20x20像素。当第一次接触食物时,它们增加到22x22 px。在第一次接触之后,我的snake块保持在22x22,而不是每个接触增加2。我不太明白您希望我在哪里添加self.showPhysics=trueyou应该有一个类来处理SKView代码,在该类的初始部分
    let bitMask = contact.BodyA.categoryBitMask | contact.BodyB.categoryBitMask

    if bitMask == physicsCategory.snakeCategory |  physicsCategory.foodCategory {
        // Increase size of the snake
    }