我正在尝试使用图形包构建的两个矩形来实现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 :(得分:1)
通过检测 collision ,您将无法做到这一点,因为您将遇到浮点精度问题。您可以做的是检测各个部分之间的重叠,如果发生这种重叠,则碰撞已经发生,因此您可以将相互冲突。
此外,您需要将引擎拆分为两种状态:
关于检测两个重叠是否重叠,请参阅此问题:
答案 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);
我希望它会有所帮助! :)