Алгоритм вычисления столкновений героя и карты
| |
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 |
|
| | |
daun | Дата: Пятница, 04 Мая 2012, 08:38 | Сообщение # 4 |
постоянный участник
Сейчас нет на сайте
| Если карта в виде массива и объекты мира обозначены цифрой, то клавишей запускается автоматический переход в соседнюю ячейку, а разрешается он проверкой, свободна ли она. До окончания перехода все действия запрещены. Горизонтальные и вертикальные действия разделены.
Если гг имеет координаты и физику, то лучше как у GECK, в некоторых случаях достаточно 4 точки крестом, с проверкой всех четырех. При не нажатых клавишах скорости затухают, при столкновении меняют знак. С гравитацией сложнее, падение обнуляется, нижняя точка приравнивается к поверхности. С лифтами еще сложнее, или гг приклеивать к поверхности, или плавно уравнивать, зависит от скоростей и гравитации.
Quote (biohazardo) Объект имеет вектор скорости, которая зависит от гравитации и стрелок, которые нажимает персонаж. Бедный геймер.
|
|
| |
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, который хочет делать игры хотя-бы чуть-чуть
|
|
| |
|