Если кто-то еще найдет этот пост, пытаясь решить такую же проблему, вот как я это сделал в конце.
В этом примере я использую слово Item для представления класса, который содержит тело и т. Д., Это может быть ваш игрок / пуля / что угодно.
В вашем классе Предметов подпишитесь на тела при столкновении и при событиях разъединения.
this.Body.OnCollision += Body_OnCollision;
this.Body.OnSeparation += Body_OnSeperation;
затем настройте элемент для элемента, чтобы он содержал количество столкновений и разделений.
private int _canBePlacedCounter = 0;
В методах обработчика событий увеличение уменьшения количества членов. В приведенном ниже коде есть дополнительные условия для меня, я хочу выполнять эти операции только тогда, когда элемент помещается в «мир».
private bool Body_OnCollision(Fixture fixturea, Fixture fixtureb, Contact contact)
{
if(this.IsBeingPlaced)
{
_canBePlacedCounter++;
}
return true;
}
private void Body_OnSeperation(Fixture fixturea, Fixture fixtureb)
{
if (this.IsBeingPlaced)
{
_canBePlacedCounter--;
}
}
Затем мы можем установить простое публичное свойство (это действительно должен быть метод, если мы хотим войти в стандарты кодирования, но это не время и не место)
public bool CanBeDropped
{
get
{
if (_canBePlacedCounter == 0) return true;
else return false;
}
}
Причина этой реализации в том, что у меня изначально был bool, который я устанавливал в true или false, когда получал одно из событий. Проблема в том, что ... Если ваш предмет сталкивается с элементом A, то сталкивается с элементом B, а затем оставляет элемент A, и вы получаете показание о том, что он не сталкивается. Итак ... используя такой счетчик, мы можем подсчитать и сосчитать все столкновения и разделения. Поверьте мне, это работает как абсолютный шарм.
Надеюсь, это кому-то пригодится.
ОБНОВЛЕНИЕ: Я обнаружил, что это хорошо работает только с основными прямоугольниками. Если вы попадаете в тела со многими полигонами, такими как те, которые автоматически генерируются из изображений, это очень ненадежно, так как по какой-то причине дальновидник регулярно вызывает меньше событий разделения, чем событий столкновения, то есть счетчик часто не возвращается в 0.