Удивительно, но до сих пор не было таких вопросов. Как нарисовать траекторию баллистического движения тела? Вроде все просто кажется, а когда начинаешь соваться получается не очень весело. Суть такая, у меня из пушки вылетает ядро (камень, стрела, мяч… все что угодно). Надо нарисовать траекторию движения этого тела, причем сделать это двумя способами: 1) Отрисовка траектории на лету (т.е. ядро летит, а за ним остается след) 2) Отрисовка траектории до выстрела (т.е. я направил пушку под определенным углом, задал скорость и уже пунктиром высвечивается будущая траектория) Т.е. нужно именно рисовать/отображать траекторию, а не писать код чтобы ядро так двигалось. Один вариант я все-таки придумал, это использовать частицы. Таким образом можно реализовать первый пункт. Недостаток этого варианта в том, что частицы жрут много памяти. Кроме того, частицы появляются через равные промежутки времени, и когда ядро летит быстро расстояние между точками траектории становиться больше (см. рис). Выглядит это некрасиво. Экспериментировал с формой частиц стало еще хуже. При реализации первого пункта проблема заключается в следующем. Написать код для траектории вроде несложно: draw_line(o_jadro.xprevious,o_jadro.yprevious,o_jadro.x,o_jadro.y) И засунуть его в степ. Т.е. он будет в каждом шаге отрисовывать маленькую черточку, из которых потом будет складываться большая линия. Проблема в том, что когда программа рисует вторую черту первая стирается! Т.е. мой вопрос фактически звучит так: как заставить фигуры, нарисованные в предыдущем шаге стираться не автоматически, а когда я этого захочу? Что касается второго пункта (это где надо заранее знать, как будет двигаться объект), то тут вообще у меня версий нет. Я хорошо знаю физику и математику, знаю баллистику, знаю как будет двигаться ядро и от чего зависит его полет. Но как все это нарисовать?! В гейм мейкер нет функции отрисовки математических функций. Здесь нельзя нарисовать параболу или гиперболу. Как же быть? Не работал ранее с путями, хотел как-то присобачить функцию draw_path(path,x,y,absolute) Первый пункт с ней сделать не получится точно, поскольку тут надо заранее знать траекторию. А второй можно еще подумать. Также не работал с сурфейсами (вообще не очень пока понимаю что это такое) может они как-то помогут? Хотя из того, что понял из справки не особо они помогут. Вот такие проблемы у меня. Подсказываейте. не разобрался как картинки вставлять: http://zalil.ru/34377741
Сообщение отредактировал AHTOXA82 - Воскресенье, 24 Марта 2013, 22:13
Почему же нельзя? draw_path вполне может нарисовать. Рассчитываешь результат функции через определённые отрезки и добавляешь его в путь. Например через каждые 100 пикселей по оси х высчитываешь координату у, результат ху добавляешь в путь (path_add_point или как то так, не помню), после того как путь просчитан до нужной координаты - отрисовываешь путь. Все. Анбаннэд. Хэлоу эгин =)
Где ball.t время прошедшее с начала полета ball.x - x координата снаряда ball.y - y координата снаряда start.x и start.y - координата начала полета ball.xf = math.cos(ang)*force - сила полета приложенная к оси x bal.yf = math.sin(ang)*force - сила полета приложенная к оси y ang - угол запуска снаряда force - сила запуска снаряда ball.speed - коэффициент скорости полета снаряда gravity - сила гравитации
Точки полета вычисляются по формуле
Код
for i=1, 10 do points[i].x = start.x + math.cos(ang)*force*ball.speed * (i*c) points[i].y = start.y + math.sin(ang)*force*ball.speed * (i*c) + (gravity*ball.speed * (i*c)^2)/2 end
Где максимальное i (здесь 10) количество точек Point[i].x и point[i].y координаты очередной точки c - коэффициент "кучности" точек
Ставим кучность и количество точек побольше и соединяем точки линиями. Чем больше точек и кучность, тем более плавно будет проходить путь.
Добавлено (25.03.2013, 01:16) --------------------------------------------- Перечитал пост. Идеально красиво не сделать, нужно максимально приблизиться к желаемому результату. На счет отрисовки в ГМС толком ничего сказать не могу, но может подойдет мой вариант хранения точек в массиве. Двумерный или одномерный без разницы. Почему нельзя знать траекторию? Не понимаю.
Сообщение отредактировал LetsOffBrains - Понедельник, 25 Марта 2013, 01:11