2016-09-01 3 views
3

Я делаю небольшую игру/RTS в середине, у меня есть следующие потребности:SpriteKit Detect Ranges

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

Мой вопрос: что было бы лучшим подходом к поиску, если вражеские юниты находятся в зоне атаки союзников или наоборот?

Что есть я пробовал:

Пока я пытался добавить SKNodes с SKPhysicsBodies для каждого единичного узла.

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

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

Я хотел бы знать, есть ли какие-то лучшие альтернативы.

ответ

2

Посмотрите в GamePlayKit,

Это может иметь некоторые вещи, которые вы хотите.

В противном случае я бы просто использовал Формулу расстояния Euclidiean https://math.stackexchange.com/questions/139600/euclidean-manhattan-distance без квадратного корня и использовал это значение на основе отрядов, а не отдельных войск. (Итак, если группа из 4 солдат атакует врага из 5 солдат, выполняется только 1 дистанционная проверка).

Причина, по которой вы не используете квадратный корень, заключается в том, что вы должны знать квадрат допустимого расстояния. Если противник на расстоянии в 10 пикселей привлекает солдат, используйте 100.

Лучший способ обработать ваших солдат, как отряды, добавить их всех в SKNode (дополнительный класс, чтобы добавить лучшую функциональность), тогда вам просто нужно сравнить эти команды SKNodes

Если вы хотите уменьшить количество проверок, сделанных вами, подумайте о том, чтобы превратить вашу игровую зону в сетку (как шахматная доска). Поскольку вы знаете размер вашей плитки, вы можете легко проверить, достаточно ли близко расположены единицы, чтобы гарантировать дистанционную проверку. НАПРИМЕР. У вас есть единица в a1, а враг - на i9, тогда вы знаете, что расстояние между ними слишком велико, чтобы блокировать друг друга, чтобы напасть друг на друга.

+0

Спасибо за ваш ответ, У меня есть некоторые проблемы с использованием отрядов для союзных подразделений (Я разрешаю пользователю полностью управлять единицами по одному или динамическими формациями). Вражеские юниты действительно идут по фиксированным отрядам. Спасибо за рекомендации по расстоянию – ColdSteel

+0

вы просто держите стопку узлов отряда удобными и используйте метод moveToParent для обмена между ними – Knight0fDragon

+0

Я думаю, это просто не подходит для моего игрового процесса (я хочу достичь элемента управления, как это было в игре Myth2). В любом случае я выполнил большинство ваших предложений. Я проверяю каждую юнитовую единицу, насколько далеко от вражеской команды, если в дальности он атакует тех, кто когда-либо находится в отряде врагов. Я вызываю эту проверку в фоновом потоке из метода - update ...однако, если я не использую подход Shield Window, fps составляет около 40, и у меня есть только 11 единиц 1 дружелюбный и 10 противников в 1 команде :-( – ColdSteel