0

我当前的实体引擎使用四叉树循环遍历所有实体(一个数组),然后使用每个实体都有的 libgdx Rectangle 实例检查冲突。

我的 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() 实际上将当前命中框的副本放置在一个新位置,并检查那里是否发生任何碰撞。我想要做的是在向左移动之前检查我的玩家左侧的区域是否没有碰撞。

我当前的问题是,如果我添加 3 个“Solid”(实体的子类)实例,它仅适用于添加的第一个实体。为什么会发生这种情况,我该如何解决?

这就是我的意思(红色框是正常的hitbox,绿色是先发制人的hitbox)。

在这张图片中,您可以看到先发制人的 hitBox 刚刚通过: 图片

但是在这个中它不能,因为我首先添加了那个块(顺便说一句,我使用 placeFree(x,y-100) 更清楚地显示绿色框):

图2

4

0 回答 0