2

Farseer3.3とXNAを使用しています。

うまく解決できないという問題があります。

私は、そこに身体があり、そこで何かをしている世界があるという状況があります。

次に、ボディが有効になっていないように設定されているオブジェクトがありますが、ボディが現在何かと衝突しているかどうかを確認する良い方法はありますか?つまり、それがクリーンスポーンであるかどうかを知るために、それを有効にして動的に設定する必要がありますか?

前もって感謝します。

4

1 に答える 1

2

ここで同じ種類の問題を解決しようとしているときにこの投稿を見つけた他の人にとっては、私が最終的にそれをどのようにしたかです。

この例では、アイテムという単語を使用して、本文などを含むクラスを表します。これは、プレーヤー/弾丸/何でもかまいません。

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;
        }
    }

この実装の理由は、元々、イベントの1つを取得するたびにtrueまたはfalseに設定したブール値を持っていたためです。問題は...アイテムがアイテムAと衝突し、次にアイテムBと衝突し、アイテムAを離れると、衝突していないという読み取り値が表示されます。つまり...このようなカウンターを使用して、すべての衝突と分離をカウントインおよびカウントできます。私を信じてください、これは絶対的な魅力のように機能します。

それがそこにいる誰かに役立つことを願っています。

更新:これは基本的な長方形でのみうまく機能することがわかりました。画像から自動的に生成されたポリゴンなど、多くのポリゴンを含むボディに入ると、非常に信頼性が低くなります。理由は何であれ、farseerは衝突イベントよりも分離イベントを定期的に発生させないため、カウンターが0に戻らないことがよくあります。

于 2011-08-30T17:54:06.530 に答える