Вы можете использовать физический движок, чтобы определять, когда включен прыжок (и это то, что я делал в своей игре). Однако я также заметил значительные накладные расходы, используя физический движок, чтобы обнаружить, когда устройство находилось на поверхности, и это потому, что обнаружение контакта в наборе спрайтов по какой-либо причине является дорогостоящим, даже когда коллизии уже включены. Даже документация Примечание:
Для лучшей производительности, только набор бит в контактах маски для взаимодействий вы заинтересованы в
Так что я нашел лучшее решение для моей игры (который имеет 25+. единичные единицы, которые все требуют обнаружения поверхности). Вместо того, чтобы проходить физический движок, я только что сделал свой собственный расчет поверхности и закрепил результат каждого обновления игры. Что-то вроде этого:
final class func getSurfaceID(nodePosition: CGPoint) -> SurfaceID {
//Loop through surface rects and see if position is inside.
}
То, что я в конечном итоге делает мое собственное обнаружение поверхности, проверяя обрабатывал, если нижняя точка моего блока был внутри любой поверхности кадров. И если ваши рамки выравниваются по оси (ваши прямоугольники не вращаются), вы можете выполнить еще более быстрые проверки, чтобы увидеть, находится ли точка внутри фрейма.
Это больше работает с точки зрения дизайна уровня, потому что вам нужно будет построить массив поверхностных фреймов либо динамически из ваших плиток, либо вручную разместить поверхностные рамки в вашем мире (это то, что я сделал).
Выполнение этого изменения уменьшило время процессора, затрачиваемое на обнаружение поверхности, с 20% до 0,1%. Это также позволяет мне проверять, лежит ли какая-либо произвольная точка на поверхности, а не создавать физическое тело (что лишние накладные расходы). Однако это решение, очевидно, не сработает для вас, если вам нужно использовать обнаружение контактов.
Теперь о вашей точке зрения о создании одного большого физического тела из более мелких.Вы можете группировать соседние плитки пола с помощью узла контейнера и воссоздать физическое тело, которое подходит для узлов, которые сгруппированы. В зависимости от того, как группируются ваши узлы и как вы перерабатываете плитки, это может усложниться. Лучшим решением было бы создание больших физических тел, которые просто перекрывают ваши плитки. Это уменьшило бы количество общих физических тел, а также количество обнаружений. И если использовать в сочетании с решением для поверхностных фреймов, вы можете действительно уменьшить свои накладные расходы.
Я не уверен, как ваша игра спроектирована и каковы ее требования. Я просто даю вам некоторые возможные решения, на которые я смотрел при разработке обнаружения поверхности в своей игре. Если вы еще не определили свою игру в инструментах, убедитесь, что обнаружение контактов действительно является источником ваших накладных расходов. Если в вашей игре нет большого количества контактов, я сомневаюсь, что это то, откуда происходят накладные расходы.
Вы тестируете устройство прямо? –