SpriteNodes регистрируют более одного столкновения за раз [дубликат]

Так я правильно настроил его на двух Mac, работающих под управлением Mac OS X El Capitan (10.11.6):

  1. Удалите 'rJava', выпустив следующие команды в окне терминала:
    Rscript -e 'remove.packages("rJava")'
    sudo Rscript -e 'remove.packages("rJava")'
    
  2. Загрузите и установите программное обеспечение Java из Oracle: https://www.java.com/en/download/mac_download.jsp
  3. Добавьте следующие строки в /Users//.bashrc, используя ваш любимый редактор:
    # Set JAVA_HOME so rJava package can find it
    export JAVA_HOME=$(/usr/libexec/java_home -v 1.8)/jre
    
  4. Закройте и перезапустите все окна терминала, R и RStudio (чтобы выбрать изменения в .bashrc).
  5. Выполните следующую команду в окне терминала:
    sudo ln -sf $(/usr/libexec/java_home)/jre/lib/server/libjvm.dylib /usr/local/lib
    
  6. Выполните следующую команду в окне терминала:
    sudo Rscript -e 'install.packages("rJava", repos="http://rforge.net", type="source")'
    

12
задан someName 15 June 2014 в 10:32
поделиться

6 ответов

У меня была та же проблема (оценка увеличивалась несколько раз за уничтожение одного врага и потери нескольких жизненных точек за один случай повреждения.) Пользователь на форумах Apple думает, что это ошибка в [SKPhysicsBody bodyWithTexture : size:] , но я не думаю, что это так, потому что это происходило и с другими конструкторами.

Во-первых, categoryBitMask и contactTestBitMask очень важны, очевидно , Взгляните на пример кода Apple SpriteKit Physics Collisions :

// Контакты часто представляют собой проблему с двойной отправкой; эффект, который вы хотите, зависит от типа обоих тел в контакте. Это пример этого методом грубой силы, проверяя типы каждого. Более сложный пример может использовать методы для объектов для проверки типа.

// Контакты могут отображаться в любом порядке, и поэтому обычно вам нужно будет проверять каждый из них. В этом примере типы категорий хорошо упорядочены, поэтому код заменяет два тела, если они не соответствуют порядку. Это позволяет коду только проверять столкновений один раз.

То, что я сделал для его решения, это установить флаг после обработки каждого условия. В моем случае я тестировал, был ли bodyA.node.parent нулевым в didBeginContact, потому что я назвал removeFromParent() на ракетах / вражеских узлах, чтобы уничтожить их.

Я думаю, вы должны ожидать, что событие будет срабатывать несколько раз, и ваш код там должен убедиться, что он обрабатывается только один раз.

13
ответ дан SFX 3 September 2018 в 15:50
поделиться

По моему опыту, didEndContact & amp; doBeginContact вызываются несколько раз, пока объекты перекрываются. Это также происходит в SceneKit с использованием iOS 9, поэтому я должен предположить, что это предполагаемое поведение.

0
ответ дан cwgso 3 September 2018 в 15:50
поделиться

Я понял легкое решение:

Просто измените значение bodyBitMask тела на 0 или неиспользованное значение сразу после обнаружения контакта.

Например:

if (firstBody.categoryBitMask == padCategory && secondBody.categoryBitMask == colorBallCategory) {

      secondBody.categoryBitMask = 0;

      // DO OTHER THING HERE

}
2
ответ дан GeneCode 3 September 2018 в 15:50
поделиться

Я столкнулся с той же проблемой. В моем случае didBeginContact() был вызван много раз (я подсчитал до 5 раз) за один контакт пули с противником. Поскольку пуля представляет собой простой формат круга, я согласен с @SFX, что это не может быть ошибкой только в Texture-Bodies. Тесты показали, что между вызовами didBeginContact() не было вызова update(). Итак, решение прост (Swift):

var updatesCalled = 0
...
internal update() {
  updatesCalled ++
}
...
internal func didBeginContact(contact: SKPhysicsContact) {
    NSLog("didBeginContact: (\(contact.contactPoint.x), \(contact.contactPoint.y)), \(updatesCalled)")
    if(updatesCalled == 0) {return} // No real change since last call
    updatesCalled = 0
    ... your code here ...
}

Я попробовал didEndContact(), но это вообще не было вызвано. Я еще не исследовал это.

BTW: Я просто переключился с Android, и меня впечатлило легкость и стабильность этой системы: -)

5
ответ дан jboi 3 September 2018 в 15:50
поделиться

Причина, по которой срабатывание didBeginContact срабатывает несколько раз, состоит в том, что у вас несколько контактных точек на вогнутых фигурах.

Если вы посмотрите на изображение ниже, вы увидите, что у меня есть 2 спрайта, черный звезда и красный прямоугольник. Когда черная звезда попадает в красный прямоугольник, она ударяет по нескольким точкам, обведенным синим цветом. Затем Sprite Kit выполнит вызов для каждого пересечения линий, чтобы разработчик мог использовать переменную contactPoint для каждого из этих контактов.

12
ответ дан Knight0fDragon 3 September 2018 в 15:50
поделиться

Вот опция, которая делает игрока неуязвимым после того, как его нажмут на заданное время:

A. Создайте переменную, которая заставит игрока неуязвимо потерять жизнь после удара в течение нескольких секунд.

  1. Создайте глобальную логическую переменную с именем isInvuln (установлено в FALSE) и NSTimeInterval с именем invulnTime.
  2. В методе, который обрабатывает контакт игрока и врага, проверьте, чтобы увидеть если isInvuln является ложным, прежде чем принимать жизнь. (если isInvuln истинно ... ничего не делать)
  3. Если isInvuln является ложным, возьмите жизнь, затем установите isInvuln в true.
     if(self.isInvuln == FALSE){
          self.player.lives-=1;
          self.isInvuln = True;}
    
  4. Добавить в ваше обновлениеWithCurrentTime:
     if(self.isInvuln==True){
     self.invulnTime += timeSinceLast;}
    
     if (self.invulnTime > 3) {             
         self.isInvuln = FALSE:}
         self.invulnTime= 0;
    

Это сделает так, что когда враг и игрок столкнутся, игрок теряет жизнь и становится неуязвимым 3 секунды. Через 3 секунды игрок может снова получить урон. Если враг связывается с игроком в течение 3 неуязвимых секунд, метод контакта ничего не делает. Надеюсь, это поможет искусить идеи для решения вашей проблемы.

1
ответ дан meisenman 3 September 2018 в 15:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: