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

Having problems calling functions in swift

当我调用我的 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
    ...
}

另一个潜在的问题是contact.bodyAcontact.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

    }

    let bitMask = contact.BodyA.categoryBitMask | contact.BodyB.categoryBitMask

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