2013-03-20 330 views
1

我試圖用兩個使用圖形包構造的矩形來實現2D碰撞檢測。 不幸的是,我開始認爲我不明白編寫一個處理這個問題的函數所需的邏輯。C++ 2D多邊形碰撞檢測

下面是我的代碼,它繪製了一個小精靈和其他幾個矩形。我的精靈隨着鍵盤輸入而移動。

我已經使用了幾本書,也嘗試過像Nehe等網站,雖然它們是非常好的教程,但它們似乎只是直接處理3D碰撞。

有人可以告訴我一個有效的方法來實現碰撞檢測使用我上面的矩形?我知道你需要比較每個對象的座標。我只是不確定如何跟蹤對象的位置,檢查碰撞並在碰撞時停止移動。

我是自學的,現在似乎已經停了幾天。我完全沒有想法,並且搜索了更多的谷歌網頁,而不是我想要記住的。我很抱歉我的天真。

我會很感激任何有建設性的意見和示例代碼。謝謝。

void drawSprite (RECT rect){ 
    glBegin(GL_QUADS); 
     glColor3f(0.2f, 0.2f, 0.2f); 
      glVertex3f(rect.x, rect.y, 0.0); 
     glColor3f(1.0f, 1.0f, 1.0f); 
      glVertex3f(rect.x, rect.y+rect.h, 0.0); 
     glColor3f(0.2f, 0.2f, 0.2f); 
      glVertex3f(rect.x+rect.w, rect.y+rect.h, 0.0); 
     glColor3f(1.0f, 1.0f, 1.0f); 
      glVertex3f(rect.x+rect.w, rect.y, 0.0); 
    glEnd(); 
} 

void drawPlatform (RECT rect){ 
    glBegin(GL_QUADS); 
     glColor3f(0.2f,0.2f,0.0f); 
      glVertex3f(rect.x, rect.y, 0.0); 
     glColor3f(1.0f,1.0f,0.0f); 
      glVertex3f(rect.x, rect.y+rect.h, 0.0); 
     glColor3f(0.2f, 0.2f, 0.0f); 
      glVertex3f(rect.x+rect.w, rect.y+rect.h, 0.0); 
     glColor3f(1.0f, 1.0f, 0.0f); 
      glVertex3f(rect.x+rect.w, rect.y, 0.0); 
    glEnd(); 
} 
+0

在網上搜索「2D碰撞檢測」會帶來很多教程。你能描述一下爲什麼這些不適合你? – 2013-03-20 14:03:22

+0

我猜是因爲我不理解他們。也許我讀了太多,讓自己感到困惑。我認爲我出錯的地方是我不是100%確定如何跟蹤精靈的當前位置,因此我認爲我總是比較精靈的起源x/y,當然這些精靈始終會返回爲假碰撞... – Reanimation 2013-03-20 14:12:43

+0

您可能需要將您的問題細化爲您正在嘗試的特定「第一步」。也許跟蹤位置。如果教程只會讓你感到困惑,那麼請求另一個教程可能不會有幫助。 – 2013-03-20 14:18:39

回答

1

你不會走到這一步通過檢測碰撞,因爲你將有浮點精度的問題。你可以做的是檢測重疊之間的rects,如果這種重疊發生碰撞已經發生,所以你可以碰撞彼此的rects。

另外,你需要在兩個國家分裂引擎:

  1. Rects得到由輸入移動
  2. 重疊的檢測,如果發現rects得到搬出彼此
  3. 顯示的場景

至於檢測兩個rects是否重疊看到這樣的問題:

Determine if two rectangles overlap each other?

+0

它應該(可能)指出,這種方法將錯過只會發生*兩次連續更新之間的衝突。 – 2013-03-20 14:07:48

+0

完全,但是這樣做並不是說任何引擎在做這類東西時都會量化T嗎? – Julik 2013-03-20 14:08:52

+0

感謝您花時間撰寫您的評論。它非常有建設性。我已經把它放在船上並寫了一個碰撞測試。我的精靈現在消失並在其原始x/y座標碰撞另一個矩形時重新出現。這不是我想要的,但至少我現在正在獲得他們之間的一些互動,這比我多天來的要多:P – Reanimation 2013-03-20 14:35:56

1

在繪製之前,您可以將此碰撞函數與AABB結構(AABB代表對齊軸邊界框)一起使用。

AABB.c

AABB* box_new(float x, float y, float w, float h, int solid) 
{ 
    AABB* box = 0; 
    box = (AABB*)malloc(sizeof(AABB*)); 

    box->x = (x) ? x : 0.0f; 
    box->y = (y) ? y : 0.0f; 
    box->width = (w) ? w : 1.0f; 
    box->height = (h) ? h : 1.0f; 

    return(box); 
} 

void box_free(AABB *box) 
{ 
    if(box) { free(box); } 
} 

int collide(AABB *box, AABB *target) 
{ 
    if 
    (
     box->x > target->x + target->width && 
     box->x + box->width < target->x && 
     box->y > target->y + target->height && 
     box->y + box->height < target->y 
    ) 
    { 
     return(0); 
    } 
    return(1); 
} 

AABB.h

#include <stdio.h> 
#include <stdlib.h> 

typedef struct AABB AABB; 
struct AABB 
{ 
    float x; 
    float y; 
    float width; 
    float height; 
    int solid; 
}; 

AABB* box_new(float x, float y, float w, float h, int solid); 
void box_free(AABB *box); 
int collide(AABB *box, AABB *target); 

我希望這將有助於! :)