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