C ++ 2D多边形碰撞检测

时间:2013-03-20 13:57:49

标签: c++ collision-detection

我正在尝试使用图形包构建的两个矩形来实现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();
}

2 个答案:

答案 0 :(得分:1)

通过检测 collision ,您将无法做到这一点,因为您将遇到浮点精度问题。您可以做的是检测各个部分之间的重叠,如果发生这种重叠,则碰撞已经发生,因此您可以将相互冲突。

此外,您需要将引擎拆分为两种状态:

  1. 通过输入移动Rects
  2. 检测到重叠,如果发现重叠,则会将其移出彼此
  3. 显示场景
  4. 关于检测两个重叠是否重叠,请参阅此问题:

    Determine if two rectangles overlap each other?

答案 1 :(得分: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);

我希望它会有所帮助! :)