Farseer 3.3 Проверка, не столкнется ли не активированное тело, если оно должно быть включено (порождение)
Я использую Farseer 3.3 и XNA.
У меня есть проблема, которую я просто не могу решить хорошим способом.
У меня есть ситуация, когда есть мир с телами, которые все работают и делают что-то там.
Затем у меня есть объект, тело которого установлено как не включенное, есть ли хороший способ проверить, сталкивается ли тело в настоящее время с чем-либо? то есть, чтобы знать, будет ли это чистый спавн, я должен включить его и установить динамический?
Заранее спасибо.
1 ответ
Если кто-то еще найдет этот пост, пытаясь решить эту проблему, вот как я это сделал в конце.
В этом примере я использую слово 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.