В моей игре много разных хороших парней и много разных плохих парней. Все они будут обстреливать друг друга снарядами, но я не хочу, чтобы какой-либо случайный побочный ущерб был нанесен для любого выравнивания. Поэтому плохие парни не должны быть в состоянии ударить / повредить других плохих парней, а хорошие парни не должны быть в состоянии ударить / повредить других хороших парней.
Я думаю о том, как решить эту проблему, сделав так, чтобы Unit
экземпляр (это javascript, кстати) обладал alignment
свойством, которое может быть как good
или bad
. И я только позволю столкновению произойти, если
class Attack
boolean didAttackCollideWithTarget(target)
return attack.source.alignment != target.alignment and collisionDetected(attack.source, target)
Это псевдокод, конечно.
Но я задаю этот вопрос, потому что у меня есть ощущение, что может быть гораздо более элегантный способ создать это, кроме добавления еще одного свойства в мой Unit
класс.
Ответы:
Фильтрация столкновений
Более надежная ситуация, которая масштабируется на многие уровни, - это использование фильтрации, которая отличается от группировки.
Это работает лучше всего, давая каждому объекту 2 битовые маски .
И только вызовите столкновение, если ниже верно.
Проще всего по умолчанию установить маску на 0xFFFF, что приведет к ее столкновению со всем. И по умолчанию Категория для 0x0001. объекты сталкиваются с категориями в маске других, будет ли столкновение.
Еще один способ думать об этом - каждый объект имеет тип и список всех типов, с которыми он может столкнуться. Только когда два объекта сталкиваются с типами друг друга, происходит столкновение. Вы могли бы иметь такое же поведение, имея список перечислений вместо маски, но маска на порядок быстрее.
Сценарий, который вы описываете
Мне нравится использовать перечисления в этой ситуации.
Так сказать, у нас есть.
Пуля, застреленная хорошим парнем
Хорошие ребята
Плохие парни
Это приводит к тому, что пуля, выпущенная хорошим парнем, попадает в другого хорошего парня.
Но это ударит плохих парней.
источник
У меня была такая же проблема в моем текущем проекте (на Java). После пары попыток это решается путем создания четырех списков. Это решение создано на Java и для 2D-игр, но также должно работать аналогичным образом на JavaScript
псевдокод
псевдокод, то же самое для класса Bullets
Возможно, это не лучшее или самое быстрое решение, но оно поможет вам в данный момент. Мне жаль, что я не могу дать вам решение в JavaScript, но я надеюсь, что смогу помочь вам
Кстати, мой английский не самый лучший, но я надеюсь, что вы могли бы следовать моим объяснениям
источник