Собираюсь делать игру пинбол для мобильного на j2me. Разрабатываю алгоритм и не могу кое-чего понять: как вычислить направление отскока шарика от кривой поверхности? (зал (игровое поле) хранится как картинка в растровом формате)
Здравствуйте, Maraba, Вы писали:
M>Собираюсь делать игру пинбол для мобильного на j2me. Разрабатываю алгоритм и не могу кое-чего понять: как вычислить направление отскока шарика от кривой поверхности? (зал (игровое поле) хранится как картинка в растровом формате)
Ну это физика. Раздел Кинематика.
Игра 2Д или 3Д?
<<Winamp играет: Luminita Anghel & Sistem (Romania) — Let Me Try>>
Здравствуйте, Maraba, Вы писали:
M>Собираюсь делать игру пинбол для мобильного на j2me. Разрабатываю алгоритм и не могу кое-чего понять: как вычислить направление отскока шарика от кривой поверхности? (зал (игровое поле) хранится как картинка в растровом формате)
Видимо определить все же угол наклона поверхности к горизонталив данной точке. Быстрее всего будет сделать это заранее и для каждой точки хранить этот угол.
M>>Собираюсь делать игру пинбол для мобильного на j2me. Разрабатываю алгоритм и не могу кое-чего понять: как вычислить направление отскока шарика от кривой поверхности? (зал (игровое поле) хранится как картинка в растровом формате)
АС>Ну это физика. Раздел Кинематика.
Я конечно могу ошибаться, но движения шариков в пинболах скорее напоминает движение под углом к горизонту в одной плоскости, чем движение по наклонной плоскости
Здравствуйте, Mamut, Вы писали:
M>>>Собираюсь делать игру пинбол для мобильного на j2me. Разрабатываю алгоритм и не могу кое-чего понять: как вычислить направление отскока шарика от кривой поверхности? (зал (игровое поле) хранится как картинка в растровом формате)
АС>>Ну это физика. Раздел Кинематика.
M>Я конечно могу ошибаться, но движения шариков в пинболах скорее напоминает движение под углом к горизонту в одной плоскости, чем движение по наклонной плоскости
Ничего не понимаю А это причем?
Хотя физика была на первом курсе, может я чего путаю
Здравствуйте, Рома Мик, Вы писали:
РМ>Здравствуйте, Maraba, Вы писали:
M>>Собираюсь делать игру пинбол для мобильного на j2me. Разрабатываю алгоритм и не могу кое-чего понять: как вычислить направление отскока шарика от кривой поверхности? (зал (игровое поле) хранится как картинка в растровом формате) РМ>Видимо определить все же угол наклона поверхности к горизонталив данной точке. Быстрее всего будет сделать это заранее и для каждой точки хранить этот угол.
Да, но если это хранить угол наклона для каждой точки, то создание и хранение залов значительно усложняется.
Здравствуйте, Александр.Сергеевич, Вы писали:
АС>Здравствуйте, Maraba, Вы писали:
M>>Собираюсь делать игру пинбол для мобильного на j2me. Разрабатываю алгоритм и не могу кое-чего понять: как вычислить направление отскока шарика от кривой поверхности? (зал (игровое поле) хранится как картинка в растровом формате)
АС>Ну это физика. Раздел Кинематика.
АС> Игра 2Д или 3Д?
Игра 2D, но все же это не физика а скорее геометрия
Здравствуйте, Maraba, Вы писали:
M>Здравствуйте, Александр.Сергеевич, Вы писали:
АС>>Здравствуйте, Maraba, Вы писали:
M>>>Собираюсь делать игру пинбол для мобильного на j2me. Разрабатываю алгоритм и не могу кое-чего понять: как вычислить направление отскока шарика от кривой поверхности? (зал (игровое поле) хранится как картинка в растровом формате)
АС>>Ну это физика. Раздел Кинематика.
АС>> Игра 2Д или 3Д? M>Игра 2D, но все же это не физика а скорее геометрия
ага, а как насчет импульса? ускорения? скорости
В общем смотри у тебя есть структура такого типа:
struct ball
{
int32_t x, y; // координаты
int32_t vx, vy; // скорость по х и у
[...тут еще чего-нибудь...]
};
теперь, когда сталкивешься с поверхностью, смотри куда она наклонена влево/право, вверх/низ и соответственно меняй знак у соответствующей компоненты скорости. Для мобилы алгоритм покатит — быстро, а реалистичность особая и не надо.
Можешь менять не просто знак скорости, а еще и величину.
В общем это то, что сейчас в голову пришло, может есть более простое решение.
Здравствуйте, Александр.Сергеевич, Вы писали:
АС>Здравствуйте, Maraba, Вы писали:
M>>Здравствуйте, Александр.Сергеевич, Вы писали:
АС>>>Здравствуйте, Maraba, Вы писали:
M>>>>Собираюсь делать игру пинбол для мобильного на j2me. Разрабатываю алгоритм и не могу кое-чего понять: как вычислить направление отскока шарика от кривой поверхности? (зал (игровое поле) хранится как картинка в растровом формате)
АС>>>Ну это физика. Раздел Кинематика.
АС>>> Игра 2Д или 3Д? M>>Игра 2D, но все же это не физика а скорее геометрия
АС>ага, а как насчет импульса? ускорения? скорости
АС>В общем смотри у тебя есть структура такого типа:
АС>
АС>struct ball
АС>{
АС> int32_t x, y; // координаты
АС> int32_t vx, vy; // скорость по х и у
АС> [...тут еще чего-нибудь...]
АС>};
АС>
АС>теперь, когда сталкивешься с поверхностью, смотри куда она наклонена влево/право, вверх/низ и соответственно меняй знак у соответствующей компоненты скорости. Для мобилы алгоритм покатит — быстро, а реалистичность особая и не надо. АС>Можешь менять не просто знак скорости, а еще и величину.
АС>В общем это то, что сейчас в голову пришло, может есть более простое решение.
То, что надо ускорение и скорость — это понятно. Как раз самая сложная проблема состоит в том, чтобы определить куда наклонена поверхность. Ведь в пинболе поверхности не только прямые, но и изогнутые.
Здравствуйте, Maraba, Вы писали:
M>То, что надо ускорение и скорость — это понятно. Как раз самая сложная проблема состоит в том, чтобы определить куда наклонена поверхность. Ведь в пинболе поверхности не только прямые, но и изогнутые.
Здравствуйте, Александр Сергеевич, Вы писали:
АС>Здравствуйте, Maraba, Вы писали:
M>>То, что надо ускорение и скорость — это понятно. Как раз самая сложная проблема состоит в том, чтобы определить куда наклонена поверхность. Ведь в пинболе поверхности не только прямые, но и изогнутые.
АС>А касательные для чего придумали?
Ну вот а как касательную провести к кривой в данной точке?
Здравствуйте, Maraba, Вы писали:
M>Здравствуйте, Рома Мик, Вы писали:
РМ>>Здравствуйте, Maraba, Вы писали:
M>>>Собираюсь делать игру пинбол для мобильного на j2me. Разрабатываю алгоритм и не могу кое-чего понять: как вычислить направление отскока шарика от кривой поверхности? (зал (игровое поле) хранится как картинка в растровом формате) РМ>>Видимо определить все же угол наклона поверхности к горизонталив данной точке. Быстрее всего будет сделать это заранее и для каждой точки хранить этот угол. M>Да, но если это хранить угол наклона для каждой точки, то создание и хранение залов значительно усложняется.
Ну хранение конечно усложняется, но не принципиально. А насчет создания, то если ручками, это должно выглядеть так: задаешь прямую или кривую (дугу, параболу, сплайн) и программа в точках, через которые линия проходит выставляет значения, таких кривых на уровень будет ну штук двадцать, не так уж и сложно. Но можно и вообще автоматизировать, т.к. чего нельзя в ранйтаме можно всегда заранее, да хотя бы на этапе загрузки.
Алгоритм такой:
1)Берем точку заведомо внутри, там где может лететь шарик и стандартным алоритмом заливки заливаем. Запоминаем крайние точки. Эти точки и есть точки, в которых шарик может ударятся, то есть для них нужны угла.
2)Выстраиваем эти точки в последовательность. Это не сложно, но писать долго. Возможно последовательностей будет несколько.
3)Для каждой точки глядя на соседей определяем угол. Вариантов расположения двух соседей всего ничего, так что это не сложно.
Здравствуйте, Рома Мик, Вы писали:
РМ>Ну хранение конечно усложняется, но не принципиально. А насчет создания, то если ручками, это должно выглядеть так: задаешь прямую или кривую (дугу, параболу, сплайн) и программа в точках, через которые линия проходит выставляет значения, таких кривых на уровень будет ну штук двадцать, не так уж и сложно. Но можно и вообще автоматизировать, т.к. чего нельзя в ранйтаме можно всегда заранее, да хотя бы на этапе загрузки. РМ>Алгоритм такой: РМ>1)Берем точку заведомо внутри, там где может лететь шарик и стандартным алоритмом заливки заливаем. Запоминаем крайние точки. Эти точки и есть точки, в которых шарик может ударятся, то есть для них нужны угла. РМ>2)Выстраиваем эти точки в последовательность. Это не сложно, но писать долго. Возможно последовательностей будет несколько. РМ>3)Для каждой точки глядя на соседей определяем угол. Вариантов расположения двух соседей всего ничего, так что это не сложно.
Ну так если определять угол для точки глядя только на две соседние точки — то это будет достаточно неточное определения угла. И как определять угол по двум соседним точкам? Провести окружность через текущую точку и две соседние, провести касательную к этой окружности и т.д.?
Здравствуйте, Maraba, Вы писали:
M>Ну так если определять угол для точки глядя только на две соседние точки — то это будет достаточно неточное определения угла. И как определять угол по двум соседним точкам? Провести окружность через текущую точку и две соседние, провести касательную к этой окружности и т.д.?
Если через три точки, то соединить две крайние, а среднюю проигнорировать.
Если через большее число, то провести сплайн (за глаза достаточно третьей степени) сразу через все, и смотреть уже его производную.
Здравствуйте, Рома Мик, Вы писали:
РМ>Если через три точки, то соединить две крайние, а среднюю проигнорировать. РМ>Если через большее число, то провести сплайн (за глаза достаточно третьей степени) сразу через все, и смотреть уже его производную.
То есть можно определить две соседние точки и провести через них прямую, от которой и просчитывать отскок? (А производную накладно считать)
Здравствуйте, Maraba, Вы писали:
M>Здравствуйте, Александр Сергеевич, Вы писали:
АС>>Здравствуйте, Maraba, Вы писали:
M>>>То, что надо ускорение и скорость — это понятно. Как раз самая сложная проблема состоит в том, чтобы определить куда наклонена поверхность. Ведь в пинболе поверхности не только прямые, но и изогнутые.
АС>>А касательные для чего придумали? M>Ну вот а как касательную провести к кривой в данной точке?
Я уже спрашивал как у тебя задается эта кривая. Параметрически? Или массивом?
Если массивом, то очень просто. Если массив такой:
В этом случае касательная (а в данном случае правильнее — стенка или сторона многоугольника), грубо это 2 соседние точки в массиве:
border[i], border[i + 1]
Повторяю. Раз пишешь для мобилы, вычислять тебе надо как можно меньше. Всё что можно посчитать заранее — надо посчитать заранее и сохранить где-то, либо считать это всё при старте, либо считать на компе, а сохранять в файл.
В общем советую массив Тем более, что упрощает задачу пересечения. А вообще конечно если кривая очень гладкая нужна, то массив большой будет. В общем тут надо выбирать что-то среднее между красивостью и скоростью + память.
<<Winamp играет: Аквариум — Мы никогда не станем старше>>
M>>Ну вот а как касательную провести к кривой в данной точке? АС>Я уже спрашивал как у тебя задается эта кривая. Параметрически? Или массивом? АС>Если массивом, то очень просто. Если массив такой:
АС>
АС>В этом случае касательная (а в данном случае правильнее — стенка или сторона многоугольника), грубо это 2 соседние точки в массиве: АС>
АС>border[i], border[i + 1]
АС>
АС>Повторяю. Раз пишешь для мобилы, вычислять тебе надо как можно меньше. Всё что можно посчитать заранее — надо посчитать заранее и сохранить где-то, либо считать это всё при старте, либо считать на компе, а сохранять в файл. АС>В общем советую массив Тем более, что упрощает задачу пересечения. А вообще конечно если кривая очень гладкая нужна, то массив большой будет. В общем тут надо выбирать что-то среднее между красивостью и скоростью + память.
Кстати массив хорош еще тем, что просто создать редактор уровней. Потом можно заделать много уровней и пусть человек играет.
<<Winamp играет: Аквариум — Мы никогда не станем старше>>
АС>Кстати массив хорош еще тем, что просто создать редактор уровней. Потом можно заделать много уровней и пусть человек играет.
То есть мне надо хранить массив опорных точек, которые будут соответствовать границам стен зала? А если зал будет храниться в таком виде, то как определять столкновение со стенкой?
Здравствуйте, Maraba, Вы писали:
M>То есть можно определить две соседние точки и провести через них прямую, от которой и просчитывать отскок? (А производную накладно считать)
Ну надо еще предусмотреть случай, когда эти точки совпадают, тогда перпендикуляр линии соединяющей центральную и соседние точки, ну а все три совпадать не могут по построению.
Для трех точек это будет эквивалентно расчету производной. И я думаю, для пинбола достаточно точно.
Здравствуйте, Maraba, Вы писали:
M>Здравствуйте, Александр Сергеевич, Вы писали:
АС>>Кстати массив хорош еще тем, что просто создать редактор уровней. Потом можно заделать много уровней и пусть человек играет.
M>То есть мне надо хранить массив опорных точек, которые будут соответствовать границам стен зала? А если зал будет храниться в таком виде, то как определять столкновение со стенкой?
У твоего шарика есть радиус.
И есть отрезок который мы проверяем на столкновение с шариком.
Если точка (ball.x + ball.radius; ball.y + ball.radius) лежит на отрезке, то столкновение произошло. Узнать лежит ли точка на отрезке, можно через уравнение прямой. Вообще тут надо смотреть не совсем так.
+-+
|0|
+-+
Вот смотри, нолик это твой шарик. И вокруг него квадрат с координатами левой верхней вершины (ball.center.x — ball.radius, ball.center.y — ball.radius) и правой нижней (ball.center.x + ball.radius, ball.center.y + ball.radius). Дык вот все 4 точки надо так проверить. Если хоть по одной координате есть пересечение — значит стукнулись.
Столкновение и отражение:
anb
\ | /
\ | /
\ | /
\|/
-------------------
n — нормаль. а — вектор падения. b — вектор отражения.
вектор а — его ты знаешь (скорость (vx, vy) ).
Пусть отрезок с которым идёт пересечение: