1

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

2 回答 2

2

您可以在绘制之前将此碰撞功能与 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);

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

于 2014-04-11T11:16:11.083 回答
1

通过检测碰撞,您不会走得那么远,因为您将遇到浮点精度问题。您可以做的是检测矩形之间的重叠,如果发生这种重叠,则碰撞已经发生,因此您可以将矩形相互碰撞。

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

  1. 矩形被输入移动
  2. 检测到重叠,如果发现,矩形将相互移开
  3. 显示场景

至于检测两个矩形是否重叠,请参见这个问题:

确定两个矩形是否相互重叠?

于 2013-03-20T14:03:30.367 回答