Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 39, средняя оценка - 4.82
sooqua
15 / 9 / 0
Регистрация: 23.02.2012
Сообщений: 135
#1

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

27.10.2012, 13:27. Просмотров 5765. Ответов 4
Метки нет (Все метки)

Пишу 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
Тогда игрока надо сдвинуть ВНИЗ.

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

Collision detection или определение столкновений - C++
Решил таки написать физику дня небольшой игрушки, начал с малого и тут же закончил) имеется массив с координатами отрезков и некая точка в...

Обработка столкновений - C++
Хочу сделать платформер но не могу сделать врагов , которые будут двигаться вертикально Когда враг двигается вверх, то все...

Обработка столкновений в игре "Танчики" - PascalABC.NET
Здравствуйте, ув. форумчане! Мне нужна помощь с обработкой столкновений (коллизией) в игре "Танчики". Есть карта (13х13), состоящая из...

Определение пользователя - простой вопрос от новичка - MS Access
Подскажите пожалуйста, как поместить в поле имя пользователя, внёсшего изменения в запись. База защищена на уровне пользователей. Спасибо!

Простой алгоритм с модулями (Ошибка: отсутствует определение процедуры) - Pascal ABC
Пока не смогла разобраться в чём дело. Pascal ABC и стандартная среда Turbo Pascal выводят разные сообщения об ошибке в разных частях...

Определение победы в игре "Крестики-нолики" - C#
p = new int { { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 } }; - массив поле....

4
KATbIK
86 / 81 / 10
Регистрация: 02.08.2011
Сообщений: 335
30.10.2012, 10:16 #2
Все куда проще чем ты думаешь.
Вот тебе проверка столкновений http://www.gamedev.ru/terms/AABB
Вот тут почитай про математику http://habrahabr.ru/post/131931/

На счет AABB там нужно будет найти величину наложения которую нужно будет умножить на ветор напровления. Почитай если будет не понятно, отпиши тут. (Читай до полного просветления, сам так делаю )
1
sooqua
15 / 9 / 0
Регистрация: 23.02.2012
Сообщений: 135
01.11.2012, 11:48  [ТС] #3
Вот это идеально:
http://noregret.org/tutor/n/collision/A1_aabb-aabb_sepaxis.swf
Только у меня нет идей как это реализовать
0
KATbIK
86 / 81 / 10
Регистрация: 02.08.2011
Сообщений: 335
01.11.2012, 13:07 #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 тоже самое
1
sooqua
15 / 9 / 0
Регистрация: 23.02.2012
Сообщений: 135
01.11.2012, 13:13  [ТС] #5
OMFG!!! it's work! ;D
спасибо огромное!!)
тему можно закрыть)
0
01.11.2012, 13:13
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.11.2012, 13:13
Привет! Вот еще темы с ответами:

Ошибка 0x000000101 , при игре 10 минутной игре в Dota 2, CS:GO - BSOD
Имя события проблемы: BlueScreen Версия ОС: 6.1.7600.2.0.0.256.48 Код языка: 1049 Дополнительные сведения об этой проблеме: ...

AS 3.0 Обработка столкновений - ActionScript
Великие гуру AS 3.0 нужен ваш совет. Можете мне скинуть пример обработки столкновений статичного объекта и управляемого с клавиатуры...

Обработка столкновений - Программирование Android
Расскажите у кого какой опыт обработки столкновений при создании игр? два спрайта, должно фиксировать их столкновение, как это сделать? ...

Обработка множества столкновений - C#
Есть игра на js и сервер на nodejs, на карте более 1000 обьектов и все нужно обрабатывать на столкновения, если обрабатывать все обьекты то...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.