Форум программистов, компьютерный форум CyberForum.ru

Определение столкновений в простой 2D игре - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 39, средняя оценка - 4.82
sooqua
15 / 9 / 0
Регистрация: 23.02.2012
Сообщений: 135
27.10.2012, 13:27     Определение столкновений в простой 2D игре #1
Пишу 2D игру (что-то вроде марио ).
В ней есть игрок и всякие предметы. Надо сделать функцию которая будет проверять не вошёл ли игрок в стену или в ящик, и если вошёл то вытащить его в самое доступное место))

У меня есть:
1) Координаты левого верхнего и правого нижнего угла игрока. (всего 4 переменные - по 2 координаты на точку (или угол, как вам удобнее))
2) Координаты левого верхнего и правого нижнего угла ящика. (то же самое, 4 переменные)
3) Ширина и высота игрока
4) Ширина и высота ящика

Выглядит столкновение примерно так (игрок - зеленый, ящик - синий):
http://dofrag.ru/upload/2461
A,A1,A2 и B,B1,B2 - не существует)) Вместо A1 - A1X и A1Y (2 координаты этой точки), вместо B2 - B2X и B2Y и т.д.
Надо получить всего 2 числа - на сколько надо сдвинуть игрока по оси X (B1X и B2X) и по Y (B1Y и B2Y) чтобы он вылез из синего квадрата, еще раз - В САМОЕ ДОСТУПНОЕ МЕСТО (в данном случае надо сдвинуть вправо). - 1) оба числа могут быть отрицательными (если надо двигать игрока влево или вверх) 2) игрок не должен деформироваться, т.е. его ширина и высота не должны измениться
И это не всё. Так как игрок может двигаться, а ящик (в моей игре) парить в воздухе, может случиться и такая ситуация:
http://dofrag.ru/upload/2462
Тогда игрока надо сдвинуть ВНИЗ.

Не смейтесь над тем как я поставил задачу, и что я делаю в программировании без элементарных знаний математики .
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.10.2012, 13:27     Определение столкновений в простой 2D игре
Посмотрите здесь:

C++ Collision detection или определение столкновений
Залипание в игре C++ Builder
Вопрос в игре C++ Builder
Блоки в игре C++ Builder
Выстрел в игре C++ Builder
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
KATbIK
 Аватар для KATbIK
86 / 81 / 10
Регистрация: 02.08.2011
Сообщений: 335
30.10.2012, 10:16     Определение столкновений в простой 2D игре #2
Все куда проще чем ты думаешь.
Вот тебе проверка столкновений http://www.gamedev.ru/terms/AABB
Вот тут почитай про математику http://habrahabr.ru/post/131931/

На счет AABB там нужно будет найти величину наложения которую нужно будет умножить на ветор напровления. Почитай если будет не понятно, отпиши тут. (Читай до полного просветления, сам так делаю )
sooqua
15 / 9 / 0
Регистрация: 23.02.2012
Сообщений: 135
01.11.2012, 11:48  [ТС]     Определение столкновений в простой 2D игре #3
Вот это идеально:
http://noregret.org/tutor/n/collisio...bb_sepaxis.swf
Только у меня нет идей как это реализовать
KATbIK
 Аватар для KATbIK
86 / 81 / 10
Регистрация: 02.08.2011
Сообщений: 335
01.11.2012, 13:07     Определение столкновений в простой 2D игре #4
Попробую по памяти накидать:

Вот структуры(пример):
C++
1
2
3
4
struct Point {
   float x;
   float y;
};
C++
1
2
3
4
struct AABB {
    Point c;    // центр
    float r[2]; // r[0] - полуширина по x, r[1] - полуширина по y  
};
С помощью этого ты сможешь определить только наличие столкновения:
C++
1
2
3
4
5
6
bool TestAABBAABB(AABB &a, AABB &b)
{
    if (fabs (a.c[0] - b.c[0]) > (a.r[0] + b.r[0])) return false;
    if (fabs (a.c[1] - b.c[1]) > (a.r[1] + b.r[1])) return false;
    return true;
}
Для того, что бы найти велечену наложения и вектор перемещения:
// где mt вектор перемещения для a
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
bool TestAABBAABB(AABB &a, AABB &b, Point &mt)
{
   double rcx = fabs (a.c[0] - b.c[0]);
   double rx = (a.r[0] + b.r[0]);
    if (rcx > rx) return false;
   double rcy = fabs (a.c[1] - b.c[1]);
   double ry = (a.r[1] + b.r[1]);
    if (rcy > ry) return false;
   double overlap_x = rcx - rx;
   double overlap_y = rcy - ry;
   mt.x = 0;
   mt.y = 0;
   if (overlap_x < overlap_y)
  {
    mt.x = overlap_x;  
    if (a.c[0] < b.c[0])
    {
       mt.x = -mt.x;
    }
  } else {
        mt.y = overlap_y;  
        if (a.c[1] < b.c[1])
       {
          mt.y = -mt.y;
       }
    }
    return true;
}
Пишу по памяти, проверяй, может есть ошибки... (времени нет проверять)

Добавлено через 22 минуты
C++
1
2
double overlap_x = rx - rсx;
double overlap_y = ry - rсy;
Добавлено через 17 минут
вот что значит быстро печатать вместо a.c[0] => a.c.x; a.c[1] => a.c.y; для b тоже самое
sooqua
15 / 9 / 0
Регистрация: 23.02.2012
Сообщений: 135
01.11.2012, 13:13  [ТС]     Определение столкновений в простой 2D игре #5
OMFG!!! it's work! ;D
спасибо огромное!!)
тему можно закрыть)
Yandex
Объявления
01.11.2012, 13:13     Определение столкновений в простой 2D игре
Ответ Создать тему
Опции темы

Текущее время: 21:18. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru