Четверг, 28 Марта 2024, 12:18

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Программирование » Общие обсуждения программистов » Алгоритм вычисления столкновений героя и карты (Так и не придумал нормального решения.)
Алгоритм вычисления столкновений героя и карты
biohazardoДата: Пятница, 04 Мая 2012, 01:13 | Сообщение # 1
участник
Сейчас нет на сайте
Пишу на Руби, а не на конструкторах. Простая 2D аркада.

Мир состоит из клеток фиксированного размера, 10 на 10 пикселей. Могу узнать в любой точке, твердая там поверхность(через которую нельзя ходить) или нет (пусто, воздух).
Живой объект - это прямоугольник с текстурой, имеет положение центра, высоту и ширину.
Живой объект не должен пересекать никак твердые клетки, может стоять на них, но не пересекать.
Объект имеет вектор скорости, которая зависит от гравитации и стрелок, которые нажимает персонаж.

Перед перемещением персонажа нужно проверить столкновения (учитывая вектор скорости), и если что обнулить скорость (или замедлить), я так думаю. Но как грамотно реализовать механизм проверок столкновений прямоугольника и точек мира, и реализовать механизм торможения??

Сколько не пытаюсь реализовать, постоянно какие то баги. В последнем варианте, который я накатал, персонаж не проваливается под землю, но и ходить не может, так как все время есть столкновение по X-оси (нижние углы персонажа сталкиваются). Ищу хорошее рабочее решение.

Интересует чисто теоретическая часть, а не реализация на каком либо языке.

Добавлено (04.05.2012, 01:13)
---------------------------------------------
И еще интересует один момент. Если все таки по каким то причинам персонаж застрял, как реализовать механизм выпрыгивания персонажа из твердой поверхности...


web-developer, который хочет делать игры хотя-бы чуть-чуть
GECKДата: Пятница, 04 Мая 2012, 06:11 | Сообщение # 2
заслуженный участник
Сейчас нет на сайте
Игра - платформер, я так понимаю? Я проверку столкновений делаю как-то так:

На столкновение проверяются только точки, помеченные зеленым. Если какая-либо из нижних точек залезла в карту, то игрок выталкивается вверх и уменьшает горизонтальную скорость. То же самое с верхними, левыми и правыми точками, только выталкивание происходит в свою сторону.
В отличие от проверки коллизий по углам прямоугольника, этот способ позволяет отдельно обработать столкновения с полом и стенами(т.е. сделать торможение, бег по стенам и прочее). Ну а также отсутствие проверки по углам позволяет игроку запрыгнуть на блок даже если он до него чуть-чуть не допрыгнул.


Всё гениальное просто. И хреново работает.

Сообщение отредактировал GECK - Пятница, 04 Мая 2012, 16:43
MrNeshДата: Пятница, 04 Мая 2012, 07:13 | Сообщение # 3
Воин добра и света
Сейчас нет на сайте
Я криво говорю теорию smile wink
Ну сделать что при пересечении изображений появлялся белый(черный...розовый smile
) и при его появлении возвращать на кадр назад smile
НО при таком подходе не полученся сделать скольжение по поверхности smile


daunДата: Пятница, 04 Мая 2012, 08:38 | Сообщение # 4
постоянный участник
Сейчас нет на сайте
Если карта в виде массива и объекты мира обозначены цифрой, то клавишей запускается автоматический переход в соседнюю ячейку, а разрешается он проверкой, свободна ли она. До окончания перехода все действия запрещены. Горизонтальные и вертикальные действия разделены.

Если гг имеет координаты и физику, то лучше как у GECK, в некоторых случаях достаточно 4 точки крестом, с проверкой всех четырех. При не нажатых клавишах скорости затухают, при столкновении меняют знак.
С гравитацией сложнее, падение обнуляется, нижняя точка приравнивается к поверхности.
С лифтами еще сложнее, или гг приклеивать к поверхности, или плавно уравнивать, зависит от скоростей и гравитации.

Quote (biohazardo)
Объект имеет вектор скорости, которая зависит от гравитации и стрелок, которые нажимает персонаж.

Бедный геймер. biggrin
biohazardoДата: Суббота, 05 Мая 2012, 00:39 | Сообщение # 5
участник
Сейчас нет на сайте
Quote (GECK)
Игра - платформер, я так понимаю? Я проверку столкновений делаю как-то так:

На столкновение проверяются только точки, помеченные зеленым. Если какая-либо из нижних точек залезла в карту, то игрок выталкивается вверх и уменьшает горизонтальную скорость. То же самое с верхними, левыми и правыми точками, только выталкивание происходит в свою сторону.


По сути платформер. Попробую так сделать.

Добавлено (05.05.2012, 00:39)
---------------------------------------------
GECK, Вроде получилось, добавил еще точек. Не знаю, как на производительности скажется, но пока работает, спасибо!

Quote (jiumx60rus)
и при его появлении возвращать на кадр назад

Ну как это на кадр назад, если вся логика уже закончилась и изменила координаты объектов. А про белый/розовый ничего не понял.


web-developer, который хочет делать игры хотя-бы чуть-чуть
Stalker_ShooterДата: Суббота, 05 Мая 2012, 14:56 | Сообщение # 6
3D XNA'шник
Сейчас нет на сайте
Если в твоем Руби есть такое понятие, как Rectangle.Left, Rectengle.Top и тп., тогда проблема решается очень простым алгоритмом. Если же нет, тогда придется делать с точками...

*Не убегай от снайпера, умрешь уставшим.
*Мои статьи...
biohazardoДата: Пятница, 11 Мая 2012, 11:23 | Сообщение # 7
участник
Сейчас нет на сайте
Quote (Stalker_Shooter)
Если в твоем Руби есть такое понятие, как Rectangle.Left, Rectengle.Top и тп., тогда проблема решается очень простым алгоритмом.


Я сам дописал эти методы. А толку то от них...

Добавлено (11.05.2012, 11:22)
---------------------------------------------
Проблемы продолжаются. Пока герой перемещается с относительно малой скоростью - всё работает прекрасно. Как только он ускоряется (даже падает с высоты прыжка), он начинают проходить сквозь блоки внизу него. 1 блок - примерно треть высоты персонажа.

Видимо скорость персонажа высока, и за один цикл он успевает пролететь расстояние больше, чем которое нужно для определения столкновения (1 пиксель у меня). Тогда я решил проверять сразу 2 прямоугольника (+1 пиксель в сторону движения, и +скорость), но всё равно даже в таком случае часто бывают баги. Скорость падения не может быть больше 10 за цикл, хотя высота блока 10, и всё равно почему то он проскакивает единичные блоки...

Что то жесть какая то...

Добавлено (11.05.2012, 11:23)
---------------------------------------------
Надо еще проверить, сколько циклов за секунду проходит. Странно что-то. Скорость 10 пикселей/цикл, а перемещается довольно плавно и медленно...


web-developer, который хочет делать игры хотя-бы чуть-чуть
Форум игроделов » Программирование » Общие обсуждения программистов » Алгоритм вычисления столкновений героя и карты (Так и не придумал нормального решения.)
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг