Суббота, 23 Ноября 2024, 19:33

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Полёт по дуге
XageuДата: Четверг, 15 Декабря 2011, 11:15 | Сообщение # 1
Хадей - Друг Детей
Сейчас нет на сайте
Пример с мячом: Есть два игрока в волейбол по разные стороны сеток. Они постоянно двигаются и пасуют друг другу мяч. Причем пас идет тогда, когда они останавливаются, и промах невозможен (пошаговый волейбол). Это предыстория.
Суть такова: Если бы не было сетки, можно было бы использовать move_towards_point. Но сетка есть, поэтому мяч должен пролетать над ней. Расстояние между игроками меняются, как по икс (влево-вправо двигаются), так и по игрек (зависают в воздухе :)).
Каким образом сделать полет из точки х1у1 в точку х2у2 по дуге? Чем короче код, тем лучше.


Dva_KotaДата: Четверг, 15 Декабря 2011, 12:27 | Сообщение # 2
заслуженный участник
Сейчас нет на сайте
Вот тут есть код: "Движение по кругу, эллипсу, спирали"
Правда это не на GML, но разобраться не сложно.

Вот пример на GML на основе этого кода: Пример движения

Здесь обсуждение этого примера (возможно здесь тоже найдется полезная информация): "Движение по овалу"


Новый пример инвентаря! /20.06.2012/

Energy Wars


Сообщение отредактировал Dva_Kota - Четверг, 15 Декабря 2011, 12:34
noTformaTДата: Четверг, 15 Декабря 2011, 12:52 | Сообщение # 3
Ukrainian independent game developer
Сейчас нет на сайте
Загё, как я понял тебе надо что-то типа этого?

http://dl.dropbox.com/u/13763116/scolop/sin_direction.html - только на флеше?

Два розовых квадрата - игроки
Синий круг - мяч...
Синий тонкий прямоугольник - высота движения по дуге...

Эсли это то что надо - могу объяснить код...


@noTformaT
XageuДата: Четверг, 15 Декабря 2011, 16:51 | Сообщение # 4
Хадей - Друг Детей
Сейчас нет на сайте
Поэкспериментировал, поясню нужду smile
Легко сделать летяющий по кривой снаряд, допустим, для игрока. И игрок бегает, стреляет, выбирает позицию так, что попадает по оппоненту.
Мне же нужно выбрать такую скорость, такой угол, и, важно, гравитацию, чтобы предмет, летя по дуге от объекта А, точно попал в объект Б (или в его координаты в начале запуска мяча, если объект Б убежал).
Извлечь можно расстояние между этими объектами, и всё, наверно. Остальное можно задать. smile


GECKДата: Суббота, 17 Декабря 2011, 19:16 | Сообщение # 5
заслуженный участник
Сейчас нет на сайте
Траектория полета мяча - это парабола. Лезем в википедию, там есть формулы, как по трем точкам построить параболу. Первая точка - это объект А, третья - объект Б, а со второй интересней.
В уравнении параболы y=ax^2+bx+c, если рассматривать его с физической точки зрения, коэффициент a - это -g/2. В игре g будет известно, так что нужно подставить -g/2 вместо a в формулу из вики и выразить y2 через x2. Выглядит не так страшно:

Вторая точка для построения траектории мяча лежит на полученной линии, можно брать любую. Точнее почти любую, надо ведь учесть, чтобы мяч еще в сетку не попал.
Начальный угол удара - это atan((y2-y1)/(x2-x1)), а сила - расстояние между первыми двумя точками.
Спутал c кривой Безье по трем точкам smile
Угол наклона можно получить из производной в точке А: atan(-g*x1+b), сила удара по y = b, сила удара по x = b/(-g*x1+b)

Добавлено (17.12.2011, 19:16)
---------------------------------------------
Заинтересовался задачкой, и в итоге пришел к более короткому решению.
Вот кусок кода, который определяет силу и угол броска:

Code
// x1, y1 - координаты объекта А, x2 и y2 - координаты объекта Б
// angle, power - угол и сила броска
// xm, ym - координаты точки, выше которой должен пролететь мяч(вершина сетки, по сути)
// g - ускорение свободного падения
angle := arctan2( ym-y1-480/abs(x1-xm)-480/abs(x2-xm)-100, xm-x1 ); // угол броска берется как угол между начальной точкой и, по сути, рандомной точкой над сеткой. Можно пошаманить с коэффициентами, посмотреть на интересные результаты  
SinCos(angle,s,c); // синус угла - в s, косинус - в c
d := g*(x2-x1)*(x2-x1)/(2*c*c*(y2-tan(angle)*(x2-x1)-y1)); // убер-формула, считает квадрат силы броска
if (d>0) then // проверка, на всякий пожарный
     power := sqrt(d)
else
     power := 0;

Небольшая демка: volleyball.exe. Как видно, мяч иногда попадает в сетку, но для игровых нужд вполне сгодится smile


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

Сообщение отредактировал GECK - Пятница, 16 Декабря 2011, 05:58
  • Страница 1 из 1
  • 1
Поиск:

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