2013-03-20 5 views
1

Я пытаюсь реализовать двумерное обнаружение столкновений с двумя прямоугольниками, построенными с использованием графического пакета. К сожалению, я начинаю думать, что не понимаю логики, необходимой для написания функции, которая будет обрабатывать это.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(); 
} 
+0

Поиск в Интернете для «Обнаружения двумерных столкновений» содержит множество учебников. Можете ли вы описать, почему они не работали для вас? –

+0

Думаю, потому что я их не понимаю. Возможно, я читал слишком много и смущаю себя. Я думаю, что, когда я ошибаюсь, я не уверен на 100%, как отслеживать текущую позицию спрайта, поэтому я думаю, что я всегда сравниваю источник спрайтов x/y, который, конечно, всегда будет возвращаться как ложный столкновение ... – Reanimation

+0

Вы можете уточнить свой вопрос до определенного «первого шага», который вы пытаетесь. Возможно, отслеживание позиции.Если учебники только смутили вас, то просьба о другом учебнике, вероятно, не поможет. –

ответ

1

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

Кроме того, вам нужно разделить двигатель в двух состояниях:

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

Как обнаруживать перекрываются ли два прямоугольников увидеть этот вопрос:

Determine if two rectangles overlap each other?

+0

Следует (возможно) отметить, что этот подход будет пропускать столкновения, которые будут возникать только между * двумя последовательными обновлениями. –

+0

Полностью, но разве это не так, что любой двигатель будет квантовать T при выполнении такого рода вещей? – Julik

+0

Спасибо, что нашли время, чтобы написать свой комментарий. Это очень конструктивно. Я взял его на борт и написал тест на столкновение. Мой спрайт теперь исчезает и снова появляется в исходных координатах x/y, когда он сталкивается с другим прямоугольником. Это не то, что я хотел, но по крайней мере сейчас я получаю некоторое взаимодействие между ними, что больше, чем у меня было в течение нескольких дней: P – Reanimation

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); 

Я надеюсь, что это поможет! :)

Смежные вопросы