Четверг, 21 Ноября 2024, 21:57

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Самонаводящаяся ракета
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
Сейчас нет на сайте
С опозданием, но сделал пример.
Выглядит так:

Русская версия записи будет позже сегодня, но нажатию кнопки скачивания это не мешает smile

Добавлено: И, русская версия!




Сообщение отредактировал 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)
  • Страница 1 из 1
  • 1
Поиск:

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