Собираюсь делать игру пинбол для мобильного на 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) ).
Пусть отрезок с которым идёт пересечение:
Здравствуйте, Александр Сергеевич, Вы писали:
АС>У твоего шарика есть радиус. АС>И есть отрезок который мы проверяем на столкновение с шариком.
....
Спасибо за подробный ответ. Но все же не все так просто.
Во-первых шарик круглый, а не квадратный, и поэтому проверять только 4 угловые точки — не совсем правильно. Из-за этого он будет отскакивать еще не дотронувшись до стенки.
Во-вторых для выяснения соприкосновения со стеной вы предлагаете определять лежит ли угловая точка шарика на отрезке, которому соответствует часть стены. Но ведь на самом деле вряд-ли точка будет непосредственно лежать на отрезке, скорее всего она его перелетит. (То есть точка в определенный момент лежала с одной стороны отрезка, в следующий проход игрового цикла она изменила свои координаты в соответствии с направлением полета шарика и уже лежит с другой стороны отрезка. Вариант когда точка попадает на отрезок очень редок)
Здравствуйте, Рома Мик, Вы писали:
РМ>Здравствуйте, Maraba, Вы писали:
M>>То есть можно определить две соседние точки и провести через них прямую, от которой и просчитывать отскок? (А производную накладно считать) РМ>Ну надо еще предусмотреть случай, когда эти точки совпадают, тогда перпендикуляр линии соединяющей центральную и соседние точки, ну а все три совпадать не могут по построению. РМ>Для трех точек это будет эквивалентно расчету производной. И я думаю, для пинбола достаточно точно.
Здравствуйте, Maraba, Вы писали:
M>Здравствуйте, Александр Сергеевич, Вы писали:
АС>>У твоего шарика есть радиус. АС>>И есть отрезок который мы проверяем на столкновение с шариком. M>....
M>Спасибо за подробный ответ. Но все же не все так просто. M> Во-первых шарик круглый, а не квадратный, и поэтому проверять только 4 угловые точки — не совсем правильно. Из-за этого он будет отскакивать еще не дотронувшись до стенки.
Ну ты же не для мейнфрейма пишешь игру . Поэтому нужны упрощения физической модели, чтобы меньше вычислять. Сделай квадрат на 5-10% меньше, и всё, пользователю этого хватит с головой. M> Во-вторых для выяснения соприкосновения со стеной вы предлагаете определять лежит ли угловая точка шарика на отрезке, которому соответствует часть стены. Но ведь на самом деле вряд-ли точка будет непосредственно лежать на отрезке, скорее всего она его перелетит. (То есть точка в определенный момент лежала с одной стороны отрезка, в следующий проход игрового цикла она изменила свои координаты в соответствии с направлением полета шарика и уже лежит с другой стороны отрезка. Вариант когда точка попадает на отрезок очень редок)
Ну это смотря на скорость движения Если 1 пиксел/цикл игры, то попадёт А если нет... Ну не обязательно проверять строго равенство (плюс надо учесть квадрат к-й немного меньше).
Здравствуйте, Александр Сергеевич, Вы писали:
АС>Ну это смотря на скорость движения Если 1 пиксел/цикл игры, то попадёт А если нет... Ну не обязательно проверять строго равенство (плюс надо учесть квадрат к-й немного меньше).
Ну если плюс-минус один пиксел, то тогда действительно попадает
Но все же почему проверять надо именно угловые точки? Вот представьте ситуацию, что мячик летит вниз, а мы проверяем угловые точки. В итоге соприкосновение будет просчитано очень не точно. Ведь в такой ситуации логичнее было бы проверять нижнюю точку шарика.
Наверное надо выбирать точку на окружности шарика в зависимости от направления его движения, и проверять только ее одну.
Здравствуйте, Maraba, Вы писали:
M>Честно говоря не понял. Можно поподробнее...
Можно.
Итак задача номер 1: найти все граничные точки, т.е. точки, о которые может стукуться шарик. Здесь заливка.
Задача 2: выстроить эти точки в последовательность. При этом возможно иногда эти точки будут повторятся, но только если где-то есть выступ в виде линии, тогда по этой линии придется пройтись туда и обратно. Здесь алгоритм выбирающий соседнии точки и помечающий, если идти некуда, то возвращающийся назад. (подробности опускаю)
Задача 3: для каждой точки последовательности найти угол к горизонту. Здесь достаточно для каждой точки взять две соседнии в последовательности и соединить прямой.
Здравствуйте, Рома Мик, Вы писали:
РМ>Здравствуйте, Maraba, Вы писали:
M>>Честно говоря не понял. Можно поподробнее... РМ>Можно. РМ>Итак задача номер 1: найти все граничные точки, т.е. точки, о которые может стукуться шарик. Здесь заливка. РМ>Задача 2: выстроить эти точки в последовательность. При этом возможно иногда эти точки будут повторятся, но только если где-то есть выступ в виде линии, тогда по этой линии придется пройтись туда и обратно. Здесь алгоритм выбирающий соседнии точки и помечающий, если идти некуда, то возвращающийся назад. (подробности опускаю) РМ>Задача 3: для каждой точки последовательности найти угол к горизонту. Здесь достаточно для каждой точки взять две соседнии в последовательности и соединить прямой.
Ну тогда получится следующее:
+++
+o+
+++
о — это данная точка на карте, + — возможные соседние точки. Если для вычисления угла составлять прямую данной точки с соседней, то тогда угол будет или 45 градусов или 90 или 180, что не есть хорошо.
Здравствуйте, Maraba, Вы писали:
M>Здравствуйте, Рома Мик, Вы писали:
РМ>>Здравствуйте, Maraba, Вы писали:
M>>>Честно говоря не понял. Можно поподробнее... РМ>>Можно. РМ>>Итак задача номер 1: найти все граничные точки, т.е. точки, о которые может стукуться шарик. Здесь заливка. РМ>>Задача 2: выстроить эти точки в последовательность. При этом возможно иногда эти точки будут повторятся, но только если где-то есть выступ в виде линии, тогда по этой линии придется пройтись туда и обратно. Здесь алгоритм выбирающий соседнии точки и помечающий, если идти некуда, то возвращающийся назад. (подробности опускаю) РМ>>Задача 3: для каждой точки последовательности найти угол к горизонту. Здесь достаточно для каждой точки взять две соседнии в последовательности и соединить прямой.
M>Ну тогда получится следующее: M>
M>+++
M>+o+
M>+++
M>
M>о — это данная точка на карте, + — возможные соседние точки. Если для вычисления угла составлять прямую данной точки с соседней, то тогда угол будет или 45 градусов или 90 или 180, что не есть хорошо.
Такого быть не может, т.к. угол ты ищешь среди граничных точек. У граничной точки строго два соседа (тоже принадлежащих границе).
Здравствуйте, Рома Мик, Вы писали:
РМ>Такого быть не может, т.к. угол ты ищешь среди граничных точек. У граничной точки строго два соседа (тоже принадлежащих границе).
Но ведь граничные точки находятся рядом. +/- один пиксель. Как там может быть какой-нибудь другой угол кроме 45, 90, 180 ?
Здравствуйте, Maraba, Вы писали:
M>Здравствуйте, Рома Мик, Вы писали:
РМ>>Такого быть не может, т.к. угол ты ищешь среди граничных точек. У граничной точки строго два соседа (тоже принадлежащих границе).
M>Но ведь граничные точки находятся рядом. +/- один пиксель. Как там может быть какой-нибудь другой угол кроме 45, 90, 180 ?
Понял, что ты имеешь ввиду. Во-первых там угол может быть еще и ~63 градуса, а во-вторых этого достаточно, так как есть еще угол полета мяча, поэтому однообразия на глаз заметно совершенно не будет, а отражаться будет вполне естественно.
Еще раз напишу, что пункт 3, можно заменить на построение сплайна через все точки, что даст более точный результат.
Здравствуйте, Александр Сергеевич, Вы писали:
АС>Уффффф. В общем вот так. Короче говоря, тебе нужен будет учебник по геометрии. Я вот в него сейчас заглядывал .
Здравствуйте, Pah, Вы писали:
Pah>Здравствуйте, Александр Сергеевич, Вы писали:
АС>>Уффффф. В общем вот так. Короче говоря, тебе нужен будет учебник по геометрии. Я вот в него сейчас заглядывал .
Pah>Оффтоп: сильное объяснение
Ну дык учебник по геометрии в этом вопросе действительно необходим. Да и вообще толстенький справочник по математике
Здравствуйте, Maraba, Вы писали:
M>Но все же почему проверять надо именно угловые точки? Вот представьте ситуацию, что мячик летит вниз, а мы проверяем угловые точки. В итоге соприкосновение будет просчитано очень не точно. Ведь в такой ситуации логичнее было бы проверять нижнюю точку шарика.
Образно говоря, угловые точки это экстремум. А очень точно считать тебе и не надо. Тебе нужна упрощенная физ. модель системы.
M>Наверное надо выбирать точку на окружности шарика в зависимости от направления его движения, и проверять только ее одну.
Как я писал, у тебя есть вектор направления. Проводим луч из центра шарика по направлению этого вектора. Ищем пересечение этого луча со стенкой. Эта точка пересечения и есть ориентир. Этот поиск надо вести только при столкновении шарика с чем-либо. Тогда и вычислений меньше и точность выше
M>>Я конечно могу ошибаться, но движения шариков в пинболах скорее напоминает движение под углом к горизонту в одной плоскости, чем движение по наклонной плоскости
АС>Ничего не понимаю А это причем?
АС>Хотя физика была на первом курсе, может я чего путаю
Это я к тому, что в пинболах на PC скорее всего движение не по наклонной плоскости, а по вертикали. А иллюзию наклонной плоскости создает картинка на фоне
M>Собираюсь делать игру пинбол для мобильного на j2me. Разрабатываю алгоритм и не могу кое-чего понять: как вычислить направление отскока шарика от кривой поверхности? (зал (игровое поле) хранится как картинка в растровом формате)
1. вслед за этим пойдет вопрос: "Ой, а как мне прочитать пиксели из картинки на j2me?" :D
2. Пинболов на j2me уже столько делано-переделано (тыб еще арканоид или тетрис взялся писать :D) что никакого коммерческого смысла заниматься очередным пинболом просто-напросто нет. Увы и ах.
3. Как старый волк демо-дизайна посоветую единственную более-менее приемлемую реализацию. Пришла на ум только что. Тупо до безобразия.
Делаешь поверх своей графики пинбольного стола еще одну картинку (карту) — карту отражений шарика.
В нее руками (лично я бы не стал писать алгоритм для ее изготовления) прописываешь значения насколько сильно отклонять dx/dy шарика.
Всё.
Кстати, тебе бы и так пришлось изготовлять разные карты. Их в хорошем пинболе, по-идее даже не одна а целая серия — там есть магнитные зоны, отталкивающие, искриваляющие, и тд.
Здравствуйте, Maraba, Вы писали:
M>Наверное надо выбирать точку на окружности шарика в зависимости от направления его движения, и проверять только ее одну.
Не поможет, а если он по касательной (чуть боком, а не только передом) ударился?
Разбей доску на квадраты, а стенки "зала" — на отрезки. Каждый тик проверяй отрезок, который проехал шарик (от точки, в которой вектор, обратный вектору скорости, пересекает окружность шарика в нач. позиции до точки, в которой вектор скорости пересекает окружность шарика в конечной позиции) на пересечение со всеми отрезками, входящими в тот квадрат, где сейчас шарик и с границами квадрата. Если траектория шарика перескла один из отрезков "стен", можно вычислить точку касания, угол отскока, и скорректировать траекторию. Затем надо проверить оставшую часть траектории шарика (иначе он сможет после отскока в узких коридорах летать сквозь стены).
Переходы шарика из квадрата в квадрат должны происходить при пересечении им границ квадратов, и, естесственно, должна срабатывать второй раз проверка траектории, уже с отрезками в другом квадрате.
Поле разбить на квадраты можно равномерно, а можно — в зависимости от плотности стенок (например, пустое место сделать одним квадратом, а "лабиринт" — 8-ю, оптимизируй на количество вычислений в секунду и глубину разбиения — это напрямую влияет на скорость и память. Разбиение, естесственно, должен генерить редактор автоматически.
p.s.: зачем дополнительные проверки? в играх типа пинболла шарик можно разогнать до огромной скорости, реально о может летать (на компе, правда) порядка 20 пикселей/тик (зависит от кол-ва тиков, конечно, но может, я делал пинг-понг, пока не стал проверять отрезки, у меня шарик летал сквозь сетку )
Здравствуйте, alex_raider, Вы писали:
M>>Собираюсь делать игру пинбол для мобильного на j2me. Разрабатываю алгоритм и не могу кое-чего понять: как вычислить направление отскока шарика от кривой поверхности? (зал (игровое поле) хранится как картинка в растровом формате)
_>1. вслед за этим пойдет вопрос: "Ой, а как мне прочитать пиксели из картинки на j2me?" :D
_>2. Пинболов на j2me уже столько делано-переделано (тыб еще арканоид или тетрис взялся писать :D) что никакого коммерческого смысла заниматься очередным пинболом просто-напросто нет. Увы и ах.
В принципе есть, при наличии каналов распространения или выходов на онный тысячи две долларов подняьт на игре можно. Но только себестоимость будет дороже таки.
_>3. Как старый волк демо-дизайна посоветую единственную более-менее приемлемую реализацию. Пришла на ум только что. Тупо до безобразия. _>Делаешь поверх своей графики пинбольного стола еще одну картинку (карту) — карту отражений шарика. _>В нее руками (лично я бы не стал писать алгоритм для ее изготовления) прописываешь значения насколько сильно отклонять dx/dy шарика.
Можно еще проще. Есть карта — в ней разными уветами ОТДЕЛЬНЫЕ типы поверхностей. Т.е. красный сфера диаметра R1, синий сфера диаметра R2, зеленый наклонная плоскость с углом A, фиолетовый пружинищая сфера радиусом R3 и придающая шарику ускорение X.
Т.е. каждую точку задават не нужно..
По такой методики сделанные все известные мне pinball-ы.
_>Всё. _>Кстати, тебе бы и так пришлось изготовлять разные карты. Их в хорошем пинболе, по-идее даже не одна а целая серия — там есть магнитные зоны, отталкивающие, искриваляющие, и тд.
_>>1. вслед за этим пойдет вопрос: "Ой, а как мне прочитать пиксели из картинки на j2me?" :D
_>>2. Пинболов на j2me уже столько делано-переделано (тыб еще арканоид или тетрис взялся писать :D) что никакого коммерческого смысла заниматься очередным пинболом просто-напросто нет. Увы и ах.
Y>В принципе есть, при наличии каналов распространения или выходов на онный тысячи две долларов подняьт на игре можно. Но только себестоимость будет дороже таки.
Ну вот интересно что и сколько стоит на этом рынке. А то я тут сижу и гадаю насколько надувапть щеки. =)
Написал блокбастер игру с сабгеймами, заставки, музыка, графика..
Если есть какие-то слышаные цифры, будь добр, откинь приватное сообщение или пошли мыло.
_>>3. Как старый волк демо-дизайна посоветую единственную более-менее приемлемую реализацию. Пришла на ум только что. Тупо до безобразия. _>>Делаешь поверх своей графики пинбольного стола еще одну картинку (карту) — карту отражений шарика. _>>В нее руками (лично я бы не стал писать алгоритм для ее изготовления) прописываешь значения насколько сильно отклонять dx/dy шарика.
Y>Можно еще проще. Есть карта — в ней разными уветами ОТДЕЛЬНЫЕ типы поверхностей. Т.е. красный сфера диаметра R1, синий сфера диаметра R2, зеленый наклонная плоскость с углом A, фиолетовый пружинищая сфера радиусом R3 и придающая шарику ускорение X.
Так это и имелось в виду. Я бы сделал слоями в фотошопе, потом бы отгрузил в RAW формат.
Y>По такой методики сделанные все известные мне pinball-ы.
Пинболы не копал =)
p.s.
Имхо пинбол далеко не тот класс игр, неудобно на мобиле, экран слишкеом мелкий. Играть с просмотром фрагмента уровня довольно неудобно. А если тормозной блюреный дисплей как на Siemens *55 то вообще швах.
Здравствуйте, alex_raider, Вы писали:
_>>>1. вслед за этим пойдет вопрос: "Ой, а как мне прочитать пиксели из картинки на j2me?" :D
_>>>2. Пинболов на j2me уже столько делано-переделано (тыб еще арканоид или тетрис взялся писать :D) что никакого коммерческого смысла заниматься очередным пинболом просто-напросто нет. Увы и ах.
Y>>В принципе есть, при наличии каналов распространения или выходов на онный тысячи две долларов подняьт на игре можно. Но только себестоимость будет дороже таки.
_>Ну вот интересно что и сколько стоит на этом рынке. А то я тут сижу и гадаю насколько надувапть щеки. =) _>Написал блокбастер игру с сабгеймами, заставки, музыка, графика..
Болкбастер игра — это какой жанр?
Вообщем не совсем понятно про "надувать щеки" — если речь идет о продажи проекта целиком, то мало данных. А так надувать щеки нужно когда крупные операторы взяли у тебя игру, а совсем раздвувать если они еще в и топе.
Тем более уже говорилось — если игра не портированная хотя бы на 30-40 моделей (а в идеале на 60-80) то ценность ее не велика какая она бы интерестная и красивая не была.
Думаю проще будет если напишешь письмо с конкретными вопросами..... Собственно секрета никакого то нет, не совсем понятно о чем рассказывать.
В целом все просто — стоимость игры 2-5 баксов. Оператор отчисляет 40-50%. Издатель забирает тоже около 50%. Хорошая игра в топе крупного опертора продается ну никак не менее 5 тысяч копий в месяц. А реально разброс от 5 до 50 тысяч. В зависимости от опертора.
_>>>3. Как старый волк демо-дизайна посоветую единственную более-менее приемлемую реализацию. Пришла на ум только что. Тупо до безобразия. _>>>Делаешь поверх своей графики пинбольного стола еще одну картинку (карту) — карту отражений шарика. _>>>В нее руками (лично я бы не стал писать алгоритм для ее изготовления) прописываешь значения насколько сильно отклонять dx/dy шарика.
Y>>Можно еще проще. Есть карта — в ней разными уветами ОТДЕЛЬНЫЕ типы поверхностей. Т.е. красный сфера диаметра R1, синий сфера диаметра R2, зеленый наклонная плоскость с углом A, фиолетовый пружинищая сфера радиусом R3 и придающая шарику ускорение X.
_>Так это и имелось в виду. Я бы сделал слоями в фотошопе, потом бы отгрузил в RAW формат.
Y>>По такой методики сделанные все известные мне pinball-ы.
_>Пинболы не копал =)
_>p.s. _> Имхо пинбол далеко не тот класс игр, неудобно на мобиле, экран слишкеом мелкий. Играть с просмотром фрагмента уровня довольно неудобно. А если тормозной блюреный дисплей как на Siemens *55 то вообще швах.
У пинбола есть другой минус который перекрывает все остальные его минусы — их очень много. Сложно найти оператора у которого в деке бы небыло пинбола. А если он есть, уговорить взять еще один — сложно.
Да, согласен что я не отписал никакой информации, пока не буду распространяться преждевременно. Скажу что ничего сверх-оригинального, но игра содержит game-story и внутри себя содержит ряд подигр, а-ля лучшие тайтлы с zx, nes, snes...
Сейчас единственное что, — ломаю голову чтобы привести игру в фантастический вид согласно моим представлениям, т.е. ищу художника. Ох и нелегкое это дело =)
Здравствуйте, Maraba, Вы писали:
M>Собираюсь делать игру пинбол для мобильного на j2me. Разрабатываю алгоритм и не могу кое-чего понять: как вычислить направление отскока шарика от кривой поверхности? M>(зал (игровое поле) хранится как картинка в растровом формате)
Вообще-то зал и шарик лучше хранить в виде абстрактных данных (например, зал — как массив поворотных точек и шарик как уравнение шара, тогда проверка столкновения будет проверяться как пересечение шара с линией из двух поворотных точек).
Т.е. суть в том, чтобы внутри программы смоделировать реальные игровые объекты, а на картинке только отображать эту модель.
Java ведь объекно-ориентированный язык, так давайте пользоваться ООП