Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.66/76: Рейтинг темы: голосов - 76, средняя оценка - 4.66
15 / 9 / 1
Регистрация: 23.02.2012
Сообщений: 135

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

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

Студворк — интернет-сервис помощи студентам
Пишу 2D игру (что-то вроде марио ).
В ней есть игрок и всякие предметы. Надо сделать функцию которая будет проверять не вошёл ли игрок в стену или в ящик, и если вошёл то вытащить его в самое доступное место))

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

Выглядит столкновение примерно так (игрок - зеленый, ящик - синий):

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

Тогда игрока надо сдвинуть ВНИЗ.

Не смейтесь над тем как я поставил задачу, и что я делаю в программировании без элементарных знаний математики .
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
27.10.2012, 13:27
Ответы с готовыми решениями:

Обработка столкновений в консольной игре
Здравствуйте, продолжаю делать свою "терминальную"(консольную) игру на C#. Столкнулся с некоторой проблемой, в частности с обработкой...

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

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

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

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

Вот структуры(пример):
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
15 / 9 / 1
Регистрация: 23.02.2012
Сообщений: 135
01.11.2012, 13:13  [ТС]
OMFG!!! it's work! ;D
спасибо огромное!!)
тему можно закрыть)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
01.11.2012, 13:13
Помогаю со студенческими работами здесь

MVC в простой игре на swing
у меня есть класс, который в моем понимании MVC является CONTROLLER, тоесть той штукой с которой взаимодействует пользователь: package...

Определение состояния соседей в игре в жизнь
Здравствуйте. Пытаюсь сделать свою вариацию игры в жизнь. Она у меня будет довольно маленькой, всего 64 клетки на площади 8Х8. Состояние...

Дописать определение победителя в игре крестики нолики (по столбцам и строкам, по диагоналям)
Добрый вечер, я хотел бы попросить помощи с моим домашним заданием. Дело в том что игру крестики нолики я написал, но а определение...

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

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


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
PowerShell Snippets
iNNOKENTIY21 11.11.2025
Модуль PowerShell 5. 1+ : Snippets. psm1 У меня модуль расположен в пользовательской папке модулей, по умолчанию: \Documents\WindowsPowerShell\Modules\Snippets\ А в самом низу файла-профиля. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru