2015-06-03 2 views
1

Я стараюсь, чтобы мой ярлык увеличивал +1 каждый раз, когда спрайт вступает в контакт с узлом контакта, но он увеличивается на большие числа, например, +23. Я думаю, что происходит то, что он учитывает каждую миллисекунду, что спрайт касается узла, но я не знаю, как это исправить. Вот мой Ярлык код узла в DidMoveToView:Почему SKLabelNode слишком сильно увеличивает контакт? (Swift)

score = 0 
     scoreLabelNode = SKLabelNode(fontNamed:"[z] Arista Light") 
     scoreLabelNode.position = CGPointMake(self.frame.size.width/2, self.frame.size.height/4) 
     scoreLabelNode.zPosition = 100 
     scoreLabelNode.fontSize = 500 
     scoreLabelNode.alpha = 0.03 
     scoreLabelNode.text = String(score) 
     self.addChild(scoreLabelNode) 

здесь мой контактный узел:

var contactNode = SKNode() 
     contactNode.position = CGPoint(x: self.frame.size.width + asteroidTexture.size().height/15 + rocket.size.width, y: 0.0) 
     contactNode.physicsBody = SKPhysicsBody(rectangleOfSize: CGSizeMake(asteroid.size.width/16, self.frame.size.height*2)) 
     contactNode.physicsBody?.dynamic = false 
     contactNode.physicsBody?.categoryBitMask = scoreCategory 
     contactNode.physicsBody?.contactTestBitMask = rocketCategory 
     contactNode.runAction(asteroidsMoveAndRemove) 
     moving.addChild(contactNode) 

и вот мой код, где, когда моя ракета спрайт вступает в контакт с contactNode это приращение:

func didBeginContact(contact: SKPhysicsContact) { 

     if moving.speed > 0 { 
      if (contact.bodyA.categoryBitMask & scoreCategory) == scoreCategory || (contact.bodyB.categoryBitMask & scoreCategory) == scoreCategory { 
       // Rocket has contact with score entity 
       score++ 
       scoreLabelNode.text = String(score) 
       println("HIT") 
      } 
      else{ 
       gameOver() 
      } 
     } 

«moving» - это когда мои астрыйские спрайты движутся, контактные узлы перемещаются вместе с ним

ответ

0

Это, вероятно, не каждая миллисекунда, а вместо этого каждый кадр, и именно поэтому вы, вероятно, в конечном итоге получаете цифры, например, +23 (Столкновение происходит на 1/3 секунды, и если оно работает на 60 FPS, что около 20 кадров).

Одна вещь, которую вы могли бы сделать, это подкласс SKNode в реальный ContactNode класс, который имеет свойство hasBeenStruck, который первоначально установлен в false или что-то в этом смысле.

Затем, когда вы проверяете контакт, вы сначала проверяете, является ли hasBeenStruck ложным. Если это так, зарегистрируйте хит и обновите оценку, а затем установите ContactNodehasBeenStruck на true. Таким образом, в следующие 20 или около того проверки, чтобы убедиться, что контакт произошел, он не будет продолжать обновлять метку, потому что условие if сработало.

Однако, если ваша игра позволяет пользователю ударить одного и того же ContactNode дважды и получить счет в оба раза, это не полное решение. Если это так, вы можете использовать таймер или период «непобедимости» для данного ContactNode.

+0

Я попробую! –

+0

Отлично, надеюсь, что все будет работать на вас! Обязательно закройте вопрос/выберите ответ, если все ответит и работает правильно :) – PD1ce

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