Самонаводящаяся ракета
| |
Overdrave | Дата: Воскресенье, 02 Июня 2013, 15:04 | Сообщение # 1 |
частый гость
Сейчас нет на сайте
| Давно пытаюсь сделать самонаводящуюся ракету. Не ту, что тупо летит напролом, с шансом попасть в цель в 100%, а ту, от которой вполне возможно увернутся. Я пытался реализовать это двумя способами: 1)Сделал небольшой объект-цель для ракеты, который с небольшим отставанием двигался за игроком (скорость этого объекта зависела от степени отставания). Ракета всё делала правильно, до тех пор, пока не достигала объекта: она попросту залагивала в нём (очевидно, не прописаны её последующие действия). тогда я рассмотрел 3 фазы разворота: *Снизить скорость *Снизить скорость до нуля и наполовину повернуться (всё плавно, офк) *Повышать скорость до обычной, завершив поворот. При всех этих стадиях проверять, совпадает ли direction ракеты с point_direction до координат игрока, если да, то просто ускоряться до нормальной скорости, ведя обыкновенное преследование. Эта система пока только в теории, не знаю, сработает ли она, ведь цель после прыжка наверняка будет оказываться над игроком...
2)Втором способ заключается в том, чтобы сравнивать координаты потенциального столкновения с координатами игрока: *на картинке увидел ошибку в виде у>yy, имелось в виду напротив, y<yy
Эту систему я реализовал таким образом: Код if Player.x>xx direction+=1
if Player.x<xx direction-=1
довольно просто, да и работает всё прекрасно, пока в дело не входит разница переменных у и уу. Может получиться так, что у<yy, а x>xx (персонаж слева сверху от ракеты), тогда ракета попросту летит вниз.
Если коротко, то два вопроса: 1)Какую из этих систем лучше всего использовать? 2)Как усовершенствовать вторую систему?
|
|
| |
zzzzza | Дата: Понедельник, 03 Июня 2013, 02:02 | Сообщение # 2 |
участник
Сейчас нет на сайте
| Overdrave, не особо понял что сделать надо)) На сколько я понял, ты хочешь, чтобы ты выбирал цель-игрок и ракета просто летела в него(не преследовала его) - по прямой?))) Если я не правильно понял, поясни:)
Сообщение отредактировал zzzzza - Понедельник, 03 Июня 2013, 02:03 |
|
| |
XDominator | Дата: Понедельник, 03 Июня 2013, 09:15 | Сообщение # 3 |
постоянный участник
Сейчас нет на сайте
| Мне кажется ты принципиально неверно подходишь к вопросу. Есть замечательная функция - direction_to_point(x,y,x1,y1) (или point_direction(x,y,x1,y1) , не помню щас точно) - которая возвращает тебе направление от точки (x, y) к точке (x1, y1). Ты можешь получать это значение каждый раз к нужному объекту - цели, которая идет за игроком, или лучше - к самому игроку. И все что тебе нужно - просто поворачивать ракету в нужную сторону в зависимости от разницы направлений - полученного функцией и собственного направления ракеты. Таким образом, ты можешь ограничить скорость поворота ракеты, и от нее вполне можно будет увернуться. Также, можно сделать скорость поворота ракеты зависимой от ее скорости полета - например чем меньше скорость, тем более резкий поворот она может сделать...
Примерно-схематично код выглядит так(степ в ракете):
Код a = direction_to_point(x , y, x1, y1) //х1, у1 - координаты цели d = direction angle = 5 -- угол поворота на 1 шаг
if a<d //если нужный угол меньше личного направления(отсчет против часовой стрелки) { if abs(a-d) <= 180 //и разница углов меньше 180 a += angle //Тогда близжайшее направление - против часовой else a -= angle // Если разница больше 180 - то близжайшее направление - по часовой } else // Иначе, если a>= d - т.е. располагается ближе к 0 по часовой стрелке { if abs(a-d) <= 180 // То все выполняется зеркально a -= angle else a += angle } Примерно так должно работать. Вообще это универсальный алгоритм для любых действий, где нужно ограничивать угловую скорость, и я успешно его применяю у себя. Не уверен что ничего не напутал например со знаками, но общая идея примерно такая. Пробуй)
Ghaarp
The soul lighter(Android, logic)
Zzzzombie RAGE!!!(For android)
|
|
| |
Overdrave | Дата: Понедельник, 03 Июня 2013, 10:57 | Сообщение # 4 |
частый гость
Сейчас нет на сайте
| XDominator Премного благодарен. Всё заработало сразу после того, как я поменял знаки |D
|
|
| |
YellowAfterlife | Дата: Вторник, 04 Июня 2013, 08:56 | Сообщение # 5 |
Сейчас нет на сайте
| С опозданием, но сделал пример. Выглядит так: Русская версия записи будет позже сегодня, но нажатию кнопки скачивания это не мешает
Добавлено: И, русская версия!
Сообщение отредактировал YellowAfterlife - Вторник, 04 Июня 2013, 22:07 |
|
| |
Overdrave | Дата: Четверг, 06 Июня 2013, 21:27 | Сообщение # 6 |
частый гость
Сейчас нет на сайте
| YellowAfterlife, спасибо, только мне надо было, чтобы ракета выстреливалась туррелью и летела в игрока...
|
|
| |
TLT | Дата: Четверг, 06 Июня 2013, 22:00 | Сообщение # 7 |
Сейчас нет на сайте
| Хороший пример.
Дао, выраженное словами, не есть истинное Дао.
|
|
| |
timyr9801 | Дата: Пятница, 07 Июня 2013, 00:11 | Сообщение # 8 |
почетный гость
Сейчас нет на сайте
| YellowAfterlife, Спасибо за пример, в дальнейшем очень пригодится:)
|
|
| |
NSakenov | Дата: Воскресенье, 09 Июня 2013, 18:33 | Сообщение # 9 |
Игродел от Глоба
Сейчас нет на сайте
| А как сделать, чтобы ракета сначала взлетела вверх, а потом направилась в сторону ГГ? Как по параболе
|
|
| |
XDominator | Дата: Понедельник, 10 Июня 2013, 15:57 | Сообщение # 10 |
постоянный участник
Сейчас нет на сайте
| Вроде просто же. Направляешь ракету неким начальным импульсом под нужным тебе углом к горизонту, через некоторое время(например пару секунд) включаешь скрипт преследования. Вуаля. Код в чистом виде я приводил сверху, он вполне подойдет, только включать его не сразу после создания объекта, а по достижении им некой высоты или через некотрое колво шагов
Ghaarp
The soul lighter(Android, logic)
Zzzzombie RAGE!!!(For android)
|
|
| |
|