2015-12-25 3 views
2

Эта функция должна увеличить размер моей змеи по ширине приращения при вызове в моей функции didbegincontact. Однако, когда контакт сделан, он вызывает функцию один раз, а затем никогда не вызывает ее снова. Я не знаю, почему при контакте это не мешает увеличения моего размера змеи приростомПроблемы с вызовами функций в swift

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) 
} 
+0

вы можете объяснить вашу проблему более четко. 'enlargeSnakeSize' просто вызывает один и размер увеличивается или нет? В следующий раз он не позвонит? –

+1

Если вы не отсортировали первое и второе тела (по категорииBitMask), вам нужно проверить, является ли 'firstBody' продуктом, а' secondBody' - змеей. – 0x141E

+1

Изменение размера спрайта не изменяет размер физического тела. Вам нужно будет создать новое, более крупное физическое тело каждый раз, когда змея будет расти. – 0x141E

ответ

0

Когда начальный контакт сделан, змея увеличивается до 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.bodyA и contact.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 
    } 
0

Похоже, вы не увеличивают PhysicsBody вашей змеи. У вас есть фиктивные хиты, показывающие в вашем приложении? Если нет, я бы рекомендовал включить их и посмотреть, как он себя ведет. В вашем коде зрения выполните следующие действия: self.showsPhysics = true

+0

Я не совсем понимаю, где вы хотите, чтобы я добавил self.showPhysics = true – user3856516

+0

у вас должен быть класс, который обрабатывает ваш код SKView, в инициирование этого – Knight0fDragon

Смежные вопросы