Головоломочка(Коллизии)
|
|
XDominator | Дата: Понедельник, 27 Мая 2013, 20:07 | Сообщение # 1 |
постоянный участник
Сейчас нет на сайте
| В общем, ситуация примерно такая - в картинках:
Состояние в 1 момент -
Состояние в некий n-ый момент:
суть вопроса - предложить некую систему, которая позволяла бы каким то образом стабильно избегать такой ситуации. Необходимо учитывать, что объект может поворачиваться с шагом <1 градуса/шаг, и точка поворта совсем необязательно стоит в центре(но при этом, точка статична, т.е. алгоритм должен учитывать лишь ее начальное состояние.). Стены могут находиться с любой стороны от объекта(слева, справа, сверху вотэвер), вариант с тем чтобы запрещать поворот при коллизии с какой то стороны не катит.
Ghaarp
The soul lighter(Android, logic)
Zzzzombie RAGE!!!(For android)
Сообщение отредактировал XDominator - Понедельник, 27 Мая 2013, 20:07 |
|
| |
YellowAfterlife | Дата: Понедельник, 27 Мая 2013, 21:08 | Сообщение # 2 |
Сейчас нет на сайте
| Код if (place_free(x, y)) { // если объект не находится в стене, image_angle += rotation; // поворачиваем объект if (!place_free(x, y)) { // если после этого объект застрял в стене, image_angle -= rotation; // отменяем поворот } }
|
|
| |
XDominator | Дата: Вторник, 28 Мая 2013, 09:42 | Сообщение # 3 |
постоянный участник
Сейчас нет на сайте
| Цитата (XDominator) вариант с тем чтобы запрещать поворот при коллизии с какой то стороны не катит. Я имел ввиду, что объект не должен быть ограничен в поворотах в принципе. Он должен менять свою позицию в пространстве так, чтобы коллизий при повороте не было(в примере, он должен постепенно сдвигаться вверх...) Хотя конечно, можно попробовать поплясать и от такого варианта... Вот если бы научиться определять координаты точки столкновения... Но я не нашел ничего такого в справке по gml
Ghaarp
The soul lighter(Android, logic)
Zzzzombie RAGE!!!(For android)
|
|
| |
Abel399 | Дата: Среда, 29 Мая 2013, 04:31 | Сообщение # 4 |
Surpass your limits. Right now.
Сейчас нет на сайте
| Ну если постепенно двигаться, то можно как-то так: Код if !(place_free(x-1,y)) { x+=1; } if !(place_free(x+1,y)) { x-=1; } if !(place_free(x,y-1)) { y+=1; } if !(place_free(x,y+1)) { y-=1; } Т.е. проверяем все во всех 4 направлениях. И если находим, то двигаемся в противоположную сторону. Подойдет дажн если стена будет диагональноперекареженной и т.п. Спасибо за внимание.
Ninja Slayer - 2D Physics Puzzle [cancelled]
|
|
| |
XDominator | Дата: Среда, 29 Мая 2013, 09:01 | Сообщение # 5 |
постоянный участник
Сейчас нет на сайте
| if !(place_free(x-1,y))
Расчет в данной функции идет не от х игрока как координаты, а от объекта в целом? Хм...
Ghaarp
The soul lighter(Android, logic)
Zzzzombie RAGE!!!(For android)
|
|
| |
Abel399 | Дата: Среда, 29 Мая 2013, 10:24 | Сообщение # 6 |
Surpass your limits. Right now.
Сейчас нет на сайте
| Если моя память не до конца атрофирована, то да) Ну, а принцип должен быть такой) Добавлено (29.05.2013, 10:24) --------------------------------------------- Вот примерчик своял быстренько) Работает вроде хорошо.. правда, есть один баг... (типо если вращаться и в упор двигаться в стенку, то через какое-то время можешь проникнуть в объект стены, но это поправимо). Управление - W,A,S,D и ЛКМ (вращение влево), так же ПКМ (вращение вправо). Спасибо за внимание :3
Ninja Slayer - 2D Physics Puzzle [cancelled]
|
|
| |
XDominator | Дата: Среда, 29 Мая 2013, 14:05 | Сообщение # 7 |
постоянный участник
Сейчас нет на сайте
| Гляну как с работы приду, если так то буду твой пример нещадно юзать в работах
Ghaarp
The soul lighter(Android, logic)
Zzzzombie RAGE!!!(For android)
|
|
| |
Saladin | Дата: Четверг, 30 Мая 2013, 11:12 | Сообщение # 8 |
заслуженный участник
Сейчас нет на сайте
| Я не совсем понимаю суть проблемы. Есть обьект со спрайтом, есть точка вращения. Берем наибольшее расстояние от точки вращения до края спрайта и ограничиваем движение к твердому обьекту на это расстояние. Все необходимые переменные у спрайта имеются, рассчитать расстояние легко.
Анбаннэд. Хэлоу эгин =)
|
|
| |
XDominator | Дата: Пятница, 31 Мая 2013, 17:44 | Сообщение # 9 |
постоянный участник
Сейчас нет на сайте
| слишком топорный способ, у длинных спрайтов будет очень большая зона "неподхождения" к объектам.
Ghaarp
The soul lighter(Android, logic)
Zzzzombie RAGE!!!(For android)
|
|
| |
Saladin | Дата: Пятница, 31 Мая 2013, 17:53 | Сообщение # 10 |
заслуженный участник
Сейчас нет на сайте
| То, что тебе нужно физически невозможно без ограничения вращения. Либо жертвовать этим, либо зоной "неподхождения".
Анбаннэд. Хэлоу эгин =)
|
|
| |