Я пытаюсь реализовать двумерное обнаружение столкновений с помощью двух прямоугольников, построенных с использованием графического пакета.
К сожалению, я начинаю думать, что не понимаю логику, необходимую для написания функции, которая справится с этим.
Ниже мой код, который рисует маленький спрайт и пару других прямоугольников. Мой спрайт перемещается с помощью клавиатуры.
Я использовал несколько книг, а также пробовал сайты, такие как Nehe и т. Д., И хотя они действительно хорошие уроки, они, похоже, имеют дело только с 3D-столкновениями.
Может кто-нибудь показать мне эффективный способ реализации обнаружения столкновений, используя мои прямоугольники выше? Я знаю, вам нужно сравнить координаты каждого объекта. Я просто не уверен, как отслеживать положение объектов, проверять столкновение и останавливать его движение в случае столкновения.
Я самообучаюсь и, кажется, уже несколько дней останавливаюсь. У меня совершенно нет идей, и я искал больше страниц Google, чем мне хотелось бы запомнить. Я извиняюсь за мою наивность.
Буду признателен за любые конструктивные комментарии и пример кода. Спасибо.
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();
}
Вы не получите это далеко, обнаружив столкновение так как у вас будут проблемы точности с плавающей точкой. Что вы можете сделать, это обнаружить перекрывается между участками, и если такое перекрытие происходит, столкновение уже произошло, так что вы можете отделить участки друг от друга.
Также вам нужно разделить двигатель на два состояния:
Что касается определения, перекрываются ли два канала, посмотрите этот вопрос:
Вы можете использовать эту функцию столкновения со структурой AABB (AABB обозначает Aligned Axis Bounding Box) перед рисованием.
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);
Надеюсь, это поможет ! 🙂