Farseer 3.3 Проверка, не столкнется ли не активированное тело, если оно должно быть включено - PullRequest
2 голосов
/ 27 августа 2011

Я использую Farseer 3.3 и XNA.

У меня есть проблема, которую я просто не могу решить хорошим способом.

У меня есть ситуация, когда есть мир, в котором все тела работают и делают что-то там.

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

Заранее спасибо.

1 Ответ

2 голосов
/ 30 августа 2011

Если кто-то еще найдет этот пост, пытаясь решить такую ​​же проблему, вот как я это сделал в конце.

В этом примере я использую слово 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.

...