Я решил проблему сам, прочитав документацию Apple и поэкспериментировав с различными вариантами. Проблема заключалась в том, что метод didBeginContact, который является методом по умолчанию, предоставляемым SpriteKit для обнаружения контактов и столкновений, вызывался несколько раз, как Джерн пытался объяснить в своем ответе. Но объекты, участвующие в столкновении в моей игре, не имеют неправильной формы. Один тип объектов имеет овальную форму, в то время как другой тип имеет более или менее прямоугольную форму. Однако метод вызывался более одного раза при каждом контакте между двумя объектами.
Как я решил это?
Я попытался применить технику, предложенную Джерн, хотя я знал, что это было не настоящее решение, которое я искал, а скорее временное прикрытие. Но на удивление это не сработало для моей игры, так как счет все равно будет увеличиваться случайным образом. Я удалил свои спрайты овальной формы и заменил их простыми круглыми спрайтами сплошного цвета на случай, если мои спрайты овальной формы не будут гладкими по краям. Даже тогда проблема продолжалась, что привело меня к документации Apple по этой ссылке ссылка . Я узнал, что для достижения наилучших характеристик физического тела и большей точности обнаружения столкновений следует по возможности использовать более простые физические тела. Круглое физическое тело наиболее эффективно с точки зрения производительности, поскольку оно довольно быстрое и простое в обработке. Далее следует прямоугольное физическое тело, за которым следует многоугольное физическое тело и физическое тело из текстуры изображения на последней. Чем сложнее физическое тело, тем больше будут вычислительные затраты и вероятность потери точности возрастет. Я создал физические тела моих сталкивающихся объектов, используя текстуру изображения. Физические тела, созданные из текстуры, каким-то образом были причиной (или, по крайней мере, в моем случае), почему методContactMethod вызывался несколько раз. Даже физическое тело простого круглого спрайта, созданного из текстуры, увеличивало счет на 2 вместо 1. Я изменил код, чтобы создать физические тела круглой формы для моих спрайтов овальной формы, и теперь все идеально, не нужно менять категорию для удаления. узлы или любой логический флаг.
Избежание нескольких вызовов метода didBeginContact с использованием логических флагов или любым другим способом может быть прикрытием, но не решением, которое работает в нескольких случаях, но не работает в других. Попробуйте использовать простейшие физические тела, где это возможно, особенно когда вы начинаете получать неточные результаты от столкновений и контактов.