0

私の現在のエンティティ エンジンは、すべてのエンティティ (配列) をループしてから、すべてのエンティティが持つ libgdx Rectangle インスタンスを使用して衝突をチェックする quadtree を使用します。

私のQuadTree(かなり長いので、IDをリンクするだけだと思いました)

Entity クラスには、placeFree メソッドがあります。

public boolean placeFree(float px, float py){

    //the pre-emptive collision Rectangle
    preCollBox.set(px,py,hitBox.getWidth(),hitBox.getHeight());

    return screen.placeFree(preCollBox);

}

screen.placeFree メソッド:

Qtree = new Quadtree(0 , new Rectangle(0,0,Gdx.graphics.getWidth(),Gdx.graphics.getHeight()));

public boolean placeFree(Rectangle rect){

    boolean result = false;

    Qtree.clear();

    for (int i = 0; i < collideEnt.size; i++) {
          Qtree.insert(collideEnt.get(i));
    }

    for(int i  = 0; i < collideEnt.size;i++){
        returnEntity.clear();
        Qtree.retrieve(returnEntity, rect);
        for (int x = 0; x < returnEntity.size; x++) {
            Entity ec = returnEntity.get(x);
                result = !(ec.hitBox.overlaps(rect));
         }
    }

    return result;

}

プリエンプティブな衝突を確認するには、次のようにします。

if(Gdx.input.isKeyPressed(Keys.D) && placeFree(x+10,y)){
        x+=10;
    }

基本的に、placeFree() は実際に現在のヒットボックスのコピーを新しい位置に配置し、そこで衝突が発生するかどうかを確認します。私がやりたいことは、左に移動する前に、プレーヤーの左側の領域に衝突がないかどうかを確認することです。

私の現在の問題は、「Solid」(エンティティのサブクラス) の 3 つのインスタンスを追加すると、追加された最初のエンティティでのみ機能することです。なぜこれが起こるのですか?どうすれば修正できますか?

ということです(赤枠は通常の当たり判定、緑は先制当たり判定)。

この写真では、プリエンプティブな hitBox が通過するだけであることがわかります。 写真

しかし、これではできません。最初にそのブロックを追加したからです (緑色のボックスをより明確に表示するために placeFree(x,y-100) を使用しました):

pic2

4

0 に答える 0