私の現在のエンティティ エンジンは、すべてのエンティティ (配列) をループしてから、すべてのエンティティが持つ 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) を使用しました):