Так я правильно настроил его на двух Mac, работающих под управлением Mac OS X El Capitan (10.11.6):
Rscript -e 'remove.packages("rJava")'
sudo Rscript -e 'remove.packages("rJava")'
/Users//.bashrc
, используя ваш любимый редактор: # Set JAVA_HOME so rJava package can find it
export JAVA_HOME=$(/usr/libexec/java_home -v 1.8)/jre
.bashrc
). sudo ln -sf $(/usr/libexec/java_home)/jre/lib/server/libjvm.dylib /usr/local/lib
sudo Rscript -e 'install.packages("rJava", repos="http://rforge.net", type="source")'
У меня была та же проблема (оценка увеличивалась несколько раз за уничтожение одного врага и потери нескольких жизненных точек за один случай повреждения.) Пользователь на форумах Apple думает, что это ошибка в [SKPhysicsBody bodyWithTexture : size:] , но я не думаю, что это так, потому что это происходило и с другими конструкторами.
Во-первых, categoryBitMask
и contactTestBitMask
очень важны, очевидно , Взгляните на пример кода Apple SpriteKit Physics Collisions :
// Контакты часто представляют собой проблему с двойной отправкой; эффект, который вы хотите, зависит от типа обоих тел в контакте. Это пример этого методом грубой силы, проверяя типы каждого. Более сложный пример может использовать методы для объектов для проверки типа.
// Контакты могут отображаться в любом порядке, и поэтому обычно вам нужно будет проверять каждый из них. В этом примере типы категорий хорошо упорядочены, поэтому код заменяет два тела, если они не соответствуют порядку. Это позволяет коду только проверять столкновений один раз.
blockquote>То, что я сделал для его решения, это установить флаг после обработки каждого условия. В моем случае я тестировал, был ли
bodyA.node.parent
нулевым вdidBeginContact
, потому что я назвалremoveFromParent()
на ракетах / вражеских узлах, чтобы уничтожить их.Я думаю, вы должны ожидать, что событие будет срабатывать несколько раз, и ваш код там должен убедиться, что он обрабатывается только один раз.
По моему опыту, didEndContact & amp; doBeginContact вызываются несколько раз, пока объекты перекрываются. Это также происходит в SceneKit с использованием iOS 9, поэтому я должен предположить, что это предполагаемое поведение.
Я понял легкое решение:
Просто измените значение bodyBitMask тела на 0 или неиспользованное значение сразу после обнаружения контакта.
Например:
if (firstBody.categoryBitMask == padCategory && secondBody.categoryBitMask == colorBallCategory) {
secondBody.categoryBitMask = 0;
// DO OTHER THING HERE
}
Я столкнулся с той же проблемой. В моем случае 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, и меня впечатлило легкость и стабильность этой системы: -)
Причина, по которой срабатывание didBeginContact срабатывает несколько раз, состоит в том, что у вас несколько контактных точек на вогнутых фигурах.
Если вы посмотрите на изображение ниже, вы увидите, что у меня есть 2 спрайта, черный звезда и красный прямоугольник. Когда черная звезда попадает в красный прямоугольник, она ударяет по нескольким точкам, обведенным синим цветом. Затем Sprite Kit выполнит вызов для каждого пересечения линий, чтобы разработчик мог использовать переменную contactPoint
для каждого из этих контактов.
Вот опция, которая делает игрока неуязвимым после того, как его нажмут на заданное время:
A. Создайте переменную, которая заставит игрока неуязвимо потерять жизнь после удара в течение нескольких секунд.
if(self.isInvuln == FALSE){
self.player.lives-=1;
self.isInvuln = True;}
if(self.isInvuln==True){
self.invulnTime += timeSinceLast;}
if (self.invulnTime > 3) {
self.isInvuln = FALSE:}
self.invulnTime= 0;
Это сделает так, что когда враг и игрок столкнутся, игрок теряет жизнь и становится неуязвимым 3 секунды. Через 3 секунды игрок может снова получить урон. Если враг связывается с игроком в течение 3 неуязвимых секунд, метод контакта ничего не делает. Надеюсь, это поможет искусить идеи для решения вашей проблемы.