2013-03-20 325 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); 

我希望这将有助于! :)