簡體   English   中英

矩形之間的碰撞檢測(無重疊) - libgdx

[英]Collision detection between rectangles (no overlap) - libgdx

我已經在這里工作了2-3個星期,我仍然無法進行適當的碰撞檢測。 我用矩形創建了一個迷宮。 我希望我的對象(在矩形中)在我的對象與任何牆碰撞並且能夠移動到任何地方(或向下滑動牆)時停止。 我的牆(矩形)具有負坐標,如下所示:

shapeRenderer.rect(0.9f, 12, 1.15f, 0, Color.RED, Color.RED, Color.RED, Color.RED); //NORTH
shapeRenderer.rect(1, 12, 0, -1.05f, Color.RED, Color.RED, Color.RED, Color.RED); // WEST
shapeRenderer.rect(2, 12, 0, -1.05f, Color.RED, Color.RED, Color.RED, Color.RED); // EAST
shapeRenderer.rect(0.9f, 11, 1.15f, 0, Color.RED, Color.RED, Color.RED, Color.RED); // SOUTH

我目前正在使用我在SO中找到的重疊方法。 這是我的CollisionManager類中的方法:

private boolean overlaps (Rectangle collision, Rectangle wall) {
    return Math.min(collision.x, collision.x + collision.width) 
        < Math.max(wall.x, wall.x + wall.width) 
    && Math.max(collision.x, collision.x + collision.width) 
        > Math.min(wall.x, wall.x + wall.width) 
    && Math.min(collision.y, collision.y + collision.height) 
        < Math.max(wall.y, wall.y + wall.height) 
    && Math.max(collision.y, collision.y + collision.height) 
        > Math.min(wall.y, wall.y + wall.height);
}

我有一個函數可以保存對象所做的所有位置移動。 因此,當發生碰撞時,對象恢復到最后一次移動之前的前一次移動(因為最后一次移動是發生碰撞時)(下面的示例):

private void overlapsTop(Entity object, Rectangle wall){

    Rectangle r = new Rectangle();
    if(spritePositions.size() != 0){
        r = spritePositions.get(spritePositions.size()-1);
    }
    object.update(r.x, r.y, r.width, r.height);
    object.getObject().setBounds(r.x, r.y, r.width, r.height);
    spritePositions.clear();
}

附加信息:我正在移動我的對象:

public void moveRight(){
    position.x += 1f;
    update();
}

public void update(){

      boundingRectangle.set(position.x, position.y, object.getWidth(), object.getHeight());
}

我被困的地方是我的重疊功能(我在SO中找到的那個)。 它適用於大多數情況; 但是,例如,如果對象在右邊的牆壁附近移動並觸摸它,則該函數返回true並執行所有操作。 但是讓我們說如果我沿着牆壁滑動並直接向下移動並且沒有牆壁,則物體在某一點停止,因為它檢測到物體底部與牆壁頂部之間的碰撞(當沒有牆壁時)和物體右側與牆壁左側之間的碰撞。

我正試圖為此找到另一種解決方案。 我只是希望我的物體停在任何牆壁上並能夠移動(或滑下牆壁)而不懷疑在附近沒有牆壁的地方可能發生碰撞。 我覺得我非常接近解決方案,但我需要一些額外的幫助。

UPDATE

我已經更新了moveRight函數和更新函數。 @Adrian Shum和@Matthew Mark Miller我現在用一個整數(意思是代替0.01f,我使用1f)制作了所有東西。

因此,我用來移動對象的以下代碼是這樣的:

if(Gdx.input.isKeyPressed(Keys.RIGHT)){

                 if(collisionManager.canSpriteNotMoveRight(object)){
                     object.stopGoingRight();
                 }else{
                     object.moveRight();
                 }
             }

在我的collisionManager類中,函數stopGoingRight如下:

public void stopGoingRight(){
    position.x -= 1f;
    update();
}

到現在為止還挺好。 當物體與牆壁碰撞時,物體會停止並反彈。 非常好。 但我有另一個問題(這很令人惱火),我會盡力描述最好的問題。 例如,如果我繼續將物體移動到牆上,物體將從該牆反彈多次; 如果我停止按下向上鍵,物體有時會卡在牆內。 因此,當我按下向下鍵時,它會上升而不是下降(或者如果我向左按下,對象將向右而不是向左),因為重疊功能被執行(因為對象和牆都是相交)。

我有辦法解決這個問題嗎? 似乎Libgdx並不是非常適合處理這種碰撞檢測,但我現在正在深入構建我的游戲。

你的碰撞算法看起來很冗長但是正確(Wordy因為x的最小值,x +寬度總是只有x,因為寬度必須> = 0,而最大值的倒數為真)。

您是否考慮過它是浮點精度問題的可能性? 例如,如果您將1添加到fp編號,然后從結果中刪除1,則無法保證返回原始值。 您可能會稍微或多或少,因為中間結果可能無法表示為浮點數。

我最喜歡的例子:.1f + .2f> .3f

我終於找到了一個很好的解決方案,這要歸功於以下鏈接: 在重疊時,玩家被卡住了libgdx矩形

基本上我必須創建一個“假”移動,以查看對象是否會與牆碰撞。 如果發生碰撞,我只是停止對象而不執行新移動。

謝謝大家的幫助:) !! 非常感謝!!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM