Обнаружение столкновений полигонов C ++ 2D

Я пытаюсь реализовать двумерное обнаружение столкновений с помощью двух прямоугольников, построенных с использованием графического пакета.
К сожалению, я начинаю думать, что не понимаю логику, необходимую для написания функции, которая справится с этим.

Ниже мой код, который рисует маленький спрайт и пару других прямоугольников. Мой спрайт перемещается с помощью клавиатуры.

Я использовал несколько книг, а также пробовал сайты, такие как 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();
}

1

Решение

Вы не получите это далеко, обнаружив столкновение так как у вас будут проблемы точности с плавающей точкой. Что вы можете сделать, это обнаружить перекрывается между участками, и если такое перекрытие происходит, столкновение уже произошло, так что вы можете отделить участки друг от друга.

Также вам нужно разделить двигатель на два состояния:

  1. Rects перемещаются вводом
  2. Перекрытия обнаруживаются, и если они обнаруживаются, то ректы удаляются друг от друга.
  3. Показать сцену

Что касается определения, перекрываются ли два канала, посмотрите этот вопрос:

Определить, перекрывают ли два прямоугольника друг друга?

1

Другие решения

Вы можете использовать эту функцию столкновения со структурой 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);

Надеюсь, это поможет ! 🙂

1

По вопросам рекламы [email protected]